Boost的scoped mutex和WinAPI的critical section有什么区别?

10
在Windows环境下,Boost的作用域互斥锁使用WinAPI的临界段(critical sections)吗?还是其他什么东西?

你没有看一下Boost源代码,是吗?:) - OregonGhost
2
我现在所处的位置无法访问它 :( - nhaa123
7
你需要访问互联网来获取Stack Overflow和Boost源代码。http://svn.boost.org/svn/boost/trunk/ - ognian
2个回答

21

boost::mutex的当前版本既不使用Win32 CRITICAL_SECTION,也不使用Win32 Mutex。相反,它使用原子操作和Win32事件进行阻塞等待。

旧版本(boost 1.34.1及以前)在Windows上是CRITICAL_SECTION的包装器。

顺便说一下,互斥锁本身没有作用域。在最近的版本中,boost::mutex::scoped_lock类型以及boost::lock_guard<boost::mutex>boost::unique_lock<boost::mutex>提供了RAII包装器来锁定互斥锁,以确保您不会忘记解锁。

boost::lock_guard<>boost::unique_lock<>模板与具有lock()unlock()成员函数的任何类型一起使用,因此如果需要,可以将它们用于跨进程互斥锁。


这可能几乎和 Win32 临界区一样高效? - unixman83
@unixman83:我怀疑这个,关键区段之所以快速是因为它仅在进程内部使用,你不能在进程之间使用。它不是内核对象,但Win32事件是。因此,我认为这不像CS那样快速。 - gbjbaanb
4
你计时了吗?请注意,只有在存在争用时,boost::mutex才会使用事件——“快速路径”仅使用原子操作。 - Anthony Williams
1
“Win32 Event for blocking waits” 是指 WaitForSingleObject 函数吗? - Guillaume Paris
@Guillaume07:是的,它在进行阻塞等待时使用了WaitForSingleObject函数来等待一个win32事件(使用CreateEvent创建)。 - Anthony Williams

3

Win32的CRITICAL_SECTION只能在单个进程的线程之间使用。如果需要在进程之间使用某些内容,则需要一个互斥量。Boost对关键部分没有任何说明,因此我认为它使用互斥量。

“scoped”只是意味着它有一个包装器,使用RAII自动解锁特定范围结束时的互斥量。


是的,这些我已经知道了。嗯,我想我需要稍后查看实际源代码。 - nhaa123
如果他们称之为“互斥锁”,并且没有提到“临界区”一词,那么可以非常高的概率认为它不是一个临界区。 - Jason S
5
然而,Boost::mutex 的文档明确表示:“这些都是线程级别的互斥锁;不支持跨进程的互斥锁”。 - Kylotan
什么鬼?OP并没有提到特定类型的互斥锁,只是询问了作用域。有interprocess_mutex和named_mutex。试着自己读文档吧。http://www.boost.org/doc/libs/1_35_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.mutexes.mutexes_interprocess_mutexes - Jason S
1
原帖提到了Boost中的互斥锁,所以自然而然地可以认为这指的是Boost::mutex而不是某个更具体的互斥锁。这是线程库的一部分,而不是互进程库,并且过去确实映射到Win32上的关键部分,而不是操作系统级别的互斥锁。因此,“我会假设它正在使用互斥锁”是一个合理的假设,但在这种情况下是错误的。即使原帖作者指的是另一种互斥锁,这个事实也意味着一般的假设并不普遍适用。 - Kylotan
显示剩余2条评论

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