pthread_spinlock是否导致从用户空间切换到内核空间

时间:2020-01-15 10:40:43

标签: c++ linux locking mutex atomic

我知道很多事情都会导致从用户空间切换到内核空间,例如mallocptherad_mutex_lock等。

我的问题是,自旋锁是否也会引起切换,还是会留在用户空间中?

此外,来自C ++ 11的std::atomic上的相同问题:std::atomic将留在用户空间中还是需要从用户空间切换到内核空间?

1 个答案:

答案 0 :(得分:1)

这取决于实现方式,pthread_spin_lock并未得到正式保证可以保留在用户空间中。实际上,在具有CAS指令的系统(即大多数商品SMP系统)上经常会出现这种情况。

以下是x86x86-64ia64sparc32sparc64PPC,{{ 3}}和SH4,它们都是基于CAS循环的。

类似地,不能保证特定的std::atomic实现不会进入内核,但是在实践中,特别是当std::atomic<T>::is_lock_free()返回true时,它将在用户空间中实现借助原子指令。

还请注意,在现代Linux中,pthread_mutex_lock是使用general case(即“用户空间互斥体”)实现的,在非竞争情况下它仍保留在用户空间中。 malloc仅在存在争用或需要保留更多虚拟内存时才会进入内核。

说过,自旋锁是否是同步的正确选择是一个更广泛的问题,它取决于系统调用的更多因素。如futex中所述,它在竞争状态非常短的真实SMP情况下很有用。性能上的大部分收益来自上下文切换和调度方面的节省。

某些互斥量实现(例如Windows关键部分)是混合的:它们将首先旋转一会儿,直到委托基于syscall的锁之后才会旋转。

相关问题