[英]difference between pthread_spinlock and boost::smart_ptr::spinlock?
[英]Does pthread_spinlock cause switch from user space to kernel space
我知道很多事情会导致从用户空间切换到内核空间,例如malloc
、 ptherad_mutex_lock
等。
我的问题是自旋锁是否也会导致切换,还是会留在用户空间?
此外,来自 C++11 的关于std::atomic
相同问题: std::atomic
将留在用户空间还是需要从用户空间切换到内核空间?
这取决于实现, pthread_spin_lock
不正式保证保留在用户空间中。 在具有 CAS 指令的系统(即大多数商品 SMP 系统)的实践中,情况通常如此。
以下是x86 、 x86-64 、 ia64 、 sparc32 、 sparc64 、 PPC 、 SH4和一般情况的 glibc 实现的链接,所有这些都基于 CAS 循环。
同样,不能保证特定的std::atomic
实现不会进入内核,但在实践中,尤其是当std::atomic<T>::is_lock_free()
返回true
,它将在用户空间中实现原子指令的帮助。
另请注意,在现代 Linux 中pthread_mutex_lock
是使用futex
实现的,即“用户空间互斥锁”,它在非争用情况下仍保留在用户空间中。 仅当存在争用或需要保留更多虚拟内存时, malloc
才会进入内核。
话虽如此,自旋锁是否是同步的正确选择是一个更广泛的问题,它取决于系统调用之外的更多因素。 正如在这个问题中所解释的,当竞争状态非常短时,它在真正的 SMP 情况下很有用。 大多数性能优势来自上下文切换和调度的节省。
一些互斥体实现(例如 Windows 临界区)是混合的:它们会先自旋一段时间,并且仅在该委托给基于系统调用的锁之后。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.