![Linux 的临界区](https://linux22.com/image/20397/Linux%20%E7%9A%84%E4%B8%B4%E7%95%8C%E5%8C%BA.png)
在linux或linux的库中,是否有与win32中的临界区等效的东西?
我知道互斥体,但它与关键部分不同,因为关键部分在内部使用用户模式自旋锁和事件对象,并且它必须比互斥体更快。
答案1
如果您想要来自内核空间的东西,那么您可能需要查看信号量 ( sem_overview(7)
)。您可以从信号量构建更高级别的结构,例如“事件”、“条件”、“互斥体”(“关键部分”)。 C 中有较旧和较新的接口。一些高级语言(如 Python 和 Perl)也公开了该接口。
您可能正在谈论的“互斥体”是 pthread 的互斥体,它将要比用户空间中的任何东西都快,尤其是使用自旋锁的空间(它是为极低级别的操作系统级别构造而设计的)。某些 pthread 的实现可能使用操作系统级别semaphore
或可能使用其他构造。
答案2
在 Linux 下,POSIX 互斥体由名为 futex(2) 的特色内核工具实现,该工具是 NPTL 的一部分。这意味着您的线程仅在需要挂起时才陷入内核空间,或者只是一个简单的用户空间函数。
自旋锁非常简单,根本不需要内核参与,您只需通过 __sync_bool_compare_and_swap() 之类的东西即可轻松构造它。 Glibc 实现了自旋锁的原因 -- man pthread_spin_init -- ,但是自旋锁并不总是像你想象的那样“快”。