我正在阅读lock_guard和unique_lock之间的区别,我发现unique_lock是lock_guard的增强版本。这样,使用一个独特的锁,锁总是可以推迟。我正在阅读this文章,我遇到了boost :: lock。 我想知道如何使用这种方法。我尝试了以下方法:
boost::mutex mutx;
boost::unique_lock<boost::mutex> guard (mutx,boost::defer_lock);
boost::lock(guard); //too few arguments in function call.
如果有人能向我解释一下boost :: lock的作用及其运作方式,我将不胜感激。谢谢
答案 0 :(得分:0)
你的意思是
mutex mutx
unique_lock<mutex> guard(mutx,defer_lock);
guard.lock();
一旦你有lock_guard
或unique_lock
,你就不再直接搞乱互斥体了,而且你还在处理守卫对象。
答案 1 :(得分:0)
boost::lock
的目的是锁定几个锁,确保不会发生死锁。
考虑这个案例:
unique_lock<...> a, b;
// thread 1
a.lock();
b.lock();
...
// thread 2
b.lock();
a.lock();
现在,如果第一个线程锁定a
锁,然后第二个线程锁定b
锁,则会出现问题:两个锁都被锁定,线程将不执行任何操作,除非其中一个解锁锁,这是不可能的。这种情况称为死锁。
boost::lock
通过解锁遇到锁定锁时已锁定的所有锁来避免此问题。两个锁定案例的实现可能如下所示:
template<class L1, class L2>
void lock(L1& l1, L2& l2)
{
while (1) {
if (l1.try_lock()) {
if (l2.try_lock()) {
return;
} else {
l1.unlock();
}
}
// yield (execute another thread) here
}
}