0

我正在阅读 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.

如果有人能向我解释 boost::lock 的作用以及它是如何工作的,我将不胜感激。谢谢

4

2 回答 2

0

你的意思

mutex mutx
unique_lock<mutex> guard(mutx,defer_lock);
guard.lock();

?

一旦你有了lock_guardor unique_lock,你就不再直接搞乱互斥锁了,你可以在守卫对象上工作。

于 2013-10-31T02:25:47.857 回答
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
    }
}
于 2013-10-31T02:46:22.983 回答