我读到了lock_guard和unique_lock之间的区别,我发现unique_lock是lock_guard的增强版本。有了唯一的锁,锁就可以被推迟,我读了这的文章,偶然发现了boost::lock。我想知道我怎样才能用这个方法。我尝试了以下几点:
boost::mutex mutx;
boost::unique_lock<boost::mutex> guard (mutx,boost::defer_lock);
boost::lock(guard); //too few arguments in function call.如果有人能向我解释一下::lock做什么以及它是如何works.Thanks的,我将不胜感激。
发布于 2013-10-31 02:46:22
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
}
}发布于 2013-10-31 02:25:47
你的意思是
mutex mutx
unique_lock<mutex> guard(mutx,defer_lock);
guard.lock();一旦您有了一个lock_guard或unique_lock,就不再直接处理互斥对象,而开始处理守护对象。
https://stackoverflow.com/questions/19697249
复制相似问题