【问题标题】:Is there a difference between Boost's scoped mutex and WinAPi's critical section?Boost 的作用域互斥锁和 WinAPi 的临界区有区别吗?
【发布时间】:2010-10-27 00:40:51
【问题描述】:

在 Windows 环境中,Boost 的作用域互斥锁是使用 WinAPI 的临界区还是其他什么?

【问题讨论】:

  • 您没有查看 Boost 源代码,是吗? :)
  • 我在一个无法访问它的位置:(
  • Stack Overflow 和 Boost 源都需要 Internet 访问权限。 svn.boost.org/svn/boost/trunk

标签: c++ multithreading boost mutex critical-section


【解决方案1】:

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:我对此表示怀疑,关键部分很快,因为它仅在进程中,您不能在进程之间使用它。它不是内核对象,但 Win32 事件是。所以我认为这不如 CS 快。
  • @gbjbaanb 你计时了吗?请注意,boost::mutex 仅在存在争用时才使用事件 --- “快速路径”仅使用原子操作。
  • by "Win32 Event for blocking waits" 是指 WaitForSingleObject 函数吗?
  • @Guillaume07:是的,它在执行阻塞等待时在 win32 事件(使用 CreateEvent 创建)上使用 WaitForSingleObject
【解决方案2】:

Win32 的 CRITICAL_SECTION 只能在单个进程的线程之间使用。如果您需要在进程之间使用某些东西,则需要一个互斥锁。 Boost 对关键部分只字未提,所以我认为它使用的是互斥锁。

“作用域”只是意味着它有一个包装器,它使用RAII 在特定作用域的末尾自动解锁互斥锁。

【讨论】:

  • 是的,这些我已经知道了。嗯,我想我需要稍后查看实际来源..
  • 如果他们称其为“互斥体”,并且不提及“临界区”这一短语,则很有可能它不是临界区。
  • Boost::interprocess 的声誉足以让我这么认为。清晰度很重要。如果它是某人的独立图书馆,我不确定我是否会如此自信。
  • 但是,Boost::mutex 的文档清楚地说“这些都是线程级互斥锁;不支持进程间互斥锁”。
  • 原发帖人询问了 Boost 中的互斥锁,因此很自然地认为这是指 Boost::mutex 而不是更具体的互斥锁。这是线程库而不是进程间库的一部分,并且在过去确实映射到 Win32 上的关键部分,而不是操作系统级别的互斥锁。因此,“我认为它正在使用互斥锁”是一个合理的假设,但在这种情况下是错误的。即使 OP 意味着不同类型的互斥体,这一事实也意味着一般假设并不普遍适用。
猜你喜欢
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 2013-08-07
  • 2011-08-28
  • 2012-03-12
  • 2011-04-13
相关资源
最近更新 更多