当我编写多线程算法时,我发现一些有用的方法可以预期互斥锁的状态。对于某些人来说,它已被锁定,对某些人来说已经锁定了。
我想出了如何确定是否必须锁定互斥锁的方法:
ASSERT(!mutex.try_lock_shared()); // assert if the mutex is not uniquely locked
ASSERT(!mutex.try_lock()); // assert if the mutex is not at least shared locked
问题是如何断言检查互斥锁未被锁定...来自当前线程。例如,如果我这样做
if (mutex.try_lock()) {
mutex.unlock();
} else {
ASSERT(false); // the mutex is locked
}
它显然会不时地失败,因为其他一些线程已将其锁定。
答案 0 :(得分:0)
boost具有递归和非递归互斥锁。如果函数是可重入的,请使用递归互斥锁。然后你不必担心当前线程是否已经锁定它。