c++ - 为什么要把 std::lock 放在 std::lock_guard 之前

标签 c++ multithreading c++11 mutex deadlock

继续 Concurrency In Action我已经达到了下面的例子。
作者指出,如果我们每次都锁定 2 mutexes同样的顺序,那么我们保证避免deadlocks .
考虑书中的这个例子:

class X
{
    private:
    some_big_object some_detail;
    std::mutex m;
public:
    X(some_big_object const& sd):some_detail(sd){}
    friend void swap(X& lhs, X& rhs)
    {
       if(&lhs==&rhs){return;}
       std::lock(lhs.m,rhs.m);
       std::lock_guard<std::mutex> lock_a(lhs.m,std::adopt_lock);
       std::lock_guard<std::mutex> lock_b(rhs.m,std::adopt_lock);
       swap(lhs.some_detail,rhs.some_detail);
    }
};
  1. 我们为什么应用 std::lock然后应用 2 std::lock_guardsstd::adopt_lock而不是一个接一个地应用 2 个 std::lock_guards
  2. 为什么我们不能把这个 2 std::mutex es 在 std::scoped_lock ??

最佳答案

Why do we apply the std::lock and then apply 2 std::lock_guards with std::adopt_lock instead of just applying 2 std::lock_guards one after another??

如果你使用两个 std::lock_guard没有 std::lock swap(a, b); 的锁定顺序与 swap(b, a); 相反,其中 abX。如果一个线程尝试 swap(a, b); 而另一个线程尝试 swap(b, a); 它们可能会死锁。第一个线程将拥有 a 的互斥锁并等待 b 的互斥锁,而第二个线程将拥有 b 的锁s mutex 并等待 a。使用 std::lock 确保锁定顺序始终一致。

Why cant we just put this 2 std::mutexes in the std::scoped_lock??

如果您查看所链接文章的发布日期,c++17 还不存在。自 std::scoped_lock是c++17引入的,不可能在文章中用到。这种锁定问题是 std::scoped_lock 旨在解决的问题,应该在现代代码中使用。

关于c++ - 为什么要把 std::lock 放在 std::lock_guard 之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50046067/

相关文章:

java - 如何处理无法将时间存储在 int 中?

c++ - 无法从项目的示例项目中重现内存清理结果

android - 写入远程数据库操作可以在单独的异步线程中进行吗? (德尔福)

c++ - main 在 pthread 之后不继续

c++ - Qt中线程间通信的实现

c++ - Std::copy 和 std::ostream_iterator 使用重载函数打印值

c++ - 无效 C 风格强制转换后的方法调用

c++ - 是否可以确定函数的参数对于可能的重载函数是有符号的还是无符号的?

c++ - 在调试 C++ 程序期间调用 round() 函数时,GDB 打印任意值

c++ - 使用元素对 vector 进行排序