【问题标题】:Deferring locks and `boost::lock`延迟锁和`boost::lock`
【发布时间】:2013-10-31 02:10:39
【问题描述】:

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

【问题讨论】:

    标签: c++ multithreading boost-mutex


    【解决方案1】:

    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
        }
    }
    

    【讨论】:

      【解决方案2】:

      你是说

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

      ?

      一旦你有了lock_guardunique_lock,你就不再直接使用互斥锁了,你可以在守卫对象上工作。

      【讨论】:

      • 感谢刚刚修复了我的代码。我理解那部分。但是我想知道boost::lock 做了什么以及如何使用它
      • 你试过reading the docs吗?我在那里说,它锁定了多个对象,避免了死锁。用一个参数来调用它没有多大意义,尽管它可以提供更多的统一性;哎呀,它甚至可以支持零参数并且什么都不做......但这不是它的设计方式。
      猜你喜欢
      • 2013-07-31
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多