Linux中最低级的锁原语是什么?

3

Linux中最低级的锁原语是什么?我知道futex_waitfutex_wake,但是futexes除了锁定还可以用于信号。最低级别的锁原语在glibc库中怎么找到?另外,条件变量也是基于futexes吗?


1
我认为“最低最低”的是CPU本身的LOCK前缀,它使您能够原子地执行某些操作。 - Daniel Kamil Kozar
1
@DanielKamilKozar ... 在 x86系列 的CPU中... - kennytm
3
futex_wait是一个系统调用,在glibc中不存在。你实际想做什么? - ott--
1
pthread锁原语是使用futex和汇编代码的混合实现的(执行不可在可移植C99中表达的操作)。 - Basile Starynkevitch
@KennyTM 这个问题被标记为 x86-64,所以我认为这是暗示。 - Daniel Kamil Kozar
2个回答

1

阅读关于futex的各种文档,包括futex(2)futex(7)手册。您将了解到pthread锁原语是通过混合使用futex和汇编代码实现的(执行不可在可移植C99中表达的操作)

(正如我在评论中所说的)


但是,所有同步对象(如pthread_mutex_lock、sem_post、sem_wait等)都基于futexes吗?还是还有其他低级原语?条件变量呢?障碍? - pythonic
1
一切都是围绕着汇编原子操作构建的。内存屏障、比较交换和保证原子读/写是最基本的构建块。 - Mahmoud Al-Qudsi

0

不存在所谓的“最低”,但是针对不同场景和目的有不同种类的锁,而“信号”并不是区分不同类型锁的正确标准。

  • 有一些锁原语会执行主动等待,自旋锁是基于原子操作的。随着C11的出现,这些甚至不再是操作系统特性,可以使用atomic_flag来实现。
  • 另一类锁原语在等待期间挂起调用线程。在Linux中,所有这些都是通过原子操作和futex作为等待部分的工作马来实现的。

自旋锁最适合用于您知道关键阶段仅涉及少量汇编指令且调度程序或信号中断关键阶段的可能性很小的情况下。这种情况适用于比许多人想象的更多的上下文环境。因此,atomic_flag是C语言中一个重要的新功能。

其他锁最适合用于主动等待会占用大量系统资源的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接