0

在 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 互斥锁。我需要提升同步对象的确切行为。

4

2 回答 2

4

您需要的是boost::recursive_mutex

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


请注意boost::mutex

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


在计算机科学中,递归互斥体称为可重入互斥体:

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

于 2013-09-03T12:50:38.303 回答
1

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

于 2013-09-03T12:51:35.953 回答