相当于windows互斥量的boost

Posted

技术标签:

【中文标题】相当于windows互斥量的boost【英文标题】:boost equivalent to windows mutex 【发布时间】:2013-09-03 12:47:22 【问题描述】:

在 Mac OS 的 boost 领域中,以下代码会自行死锁:

boost::mutex m;

m.lock();
m.lock();

也一样

boost::mutex m;

boost::mutex::scoped_lock lock(m);
boost::mutex::scoped_lock lock(m);

在 Windows 领域,只要发布计数相同,同一个线程就可以根据需要多次获得 Win32 互斥锁。我需要提升同步对象的确切行为。

【问题讨论】:

正确的术语是“可重入”。所以如果你说的是真的,在 MacOS 上 boost::mutex 不是可重入的,而在 Windows 上是可重入的。 谢谢,“reentrant”是我错过的词。是的,看起来是这样。 【参考方案1】:

你需要的是boost::recursive_mutex:

recursive_mutex 类使用递归锁定策略,因此尝试递归锁定 recursive_mutex 对象会成功,并且会保持内部“锁定计数”。尝试通过不拥有锁的线程解锁 recursive_mutex 对象会导致未定义的行为。

注意boost::mutex:

互斥锁类使用未指定的锁定策略,因此尝试递归锁定互斥锁对象或尝试由不拥有锁的线程解锁一个互斥锁对象会导致未定义的行为。这种策略允许在任何给定平台上尽可能高效地实现。

在计算机科学中,递归互斥锁称为Reentrant Mutex:

在计算机科学中,可重入互斥锁是一种互斥、递归锁机制。在可重入互斥体中,同一个线程可以多次获取锁。但是,锁必须释放相同的次数,否则其他线程将无法获取锁

【讨论】:

谢谢,你拯救了我的一天。从 WinAPI 移植到 boost 有时会非常棒。 @MartinSchlott 我在浏览 Boost 文档时总是遇到问题 :-)【参考方案2】:

尝试使用递归互斥锁:由于 boost::mutex 不是递归的,我们需要使用它的递归版本boost::recursive_mutex

【讨论】:

以上是关于相当于windows互斥量的boost的主要内容,如果未能解决你的问题,请参考以下文章

boost-同步-互斥量类型

以Linux下的测试程序说明递归型互斥量和普通互斥量的区别

C++11多线程 互斥量的概念用法死锁演示及解决详解

Qt系列文章之三十一 (基于QThread互斥量的线程同步线程)

Qt系列文章之三十一 (基于QThread互斥量的线程同步线程)

提升互斥量抛出(奇怪?)异常