推迟锁和`boost :: lock`

时间:2013-10-31 02:10:40

标签: c++ multithreading boost-mutex

我正在阅读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的作用及其运作方式,我将不胜感激。谢谢

2 个答案:

答案 0 :(得分:0)

你的意思是

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

一旦你有lock_guardunique_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
    }
}