使用自旋锁来锁定在不同线程中同时使用的变量?

Posted

技术标签:

【中文标题】使用自旋锁来锁定在不同线程中同时使用的变量?【英文标题】:Using spin lock to lock a variable being concurrently used in a different thread? 【发布时间】:2021-12-13 22:37:07 【问题描述】:

假设您调用 spin_lock(&key) 并且 key 正在同时在不同的线程中对其执行某种类型的操作。其他线程是否正在暂停/中断?

正在更改或使用密钥的其他线程会发生什么?比如线程调用copy_to_user(key)、copy_from_user(key)或者kmallocing/kfreeing key?

【问题讨论】:

您应该只对排他锁内的共享数据执行操作。 你说的是内核内部的spin_lock?我认为spin_lock 的参数是指向锁本身的指针。除了锁定或解锁之外,您实际上无法对锁执行任何类型的操作,当然同时尝试这些操作是安全的。 如果您询问自旋锁要保护的数据对象上的操作,那么不,获取锁不会以任何方式暂停、中断或回滚那些操作。因此,其他线程首先应该在执行这些操作之前锁定自旋锁。 【参考方案1】:

不具体了解Linux kernel spin_lock(),但在几乎所有编程环境中,mutex locking is advisory。这意味着,锁定一个锁永远不会阻止任何事情,除非它阻止其他线程同时锁定同一个锁。如果您想使用锁来保护某些变量或数据结构,则完全由程序员负责确保系统中的任何代码都不会访问数据,除非锁被锁定。

【讨论】:

以上是关于使用自旋锁来锁定在不同线程中同时使用的变量?的主要内容,如果未能解决你的问题,请参考以下文章

详解linux多线程——互斥锁条件变量读写锁自旋锁信号量

OpenCL 内核中的组内同步,在本地内存上使用自旋锁

Linux多线程中互斥锁读写锁自旋锁条件变量信号量详解

自旋锁,互斥锁,原子变量性能对比

JVM锁优化

Linux设备驱动程序 之 自旋锁