【发布时间】:2018-10-07 08:02:30
【问题描述】:
与Concurrency In Action 一起前进我已经达到了以下示例。
Tha作者指出,如果我们每次都以相同的顺序锁定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);
}
};
- 为什么我们应用
std::lock,然后应用2个std::lock_guards和std::adopt_lock,而不是一个接一个地应用2个std::lock_guards? - 为什么我们不能把这 2 个
std::mutexes 放在std::scoped_lock中??
【问题讨论】:
-
(1) 死锁。 (2) 你说的是哪个
scoped_lock?我在代码中没有看到任何scoped_lock。 -
我不是用锁的三行,为什么我们不能把 2 个 mtexes 放在 scopted 锁中
-
@RaymondChen OP 询问为什么不能使用
std::scoped_lock而不是std::lock和两个std::lock_guard。 -
当然,如果你有一台时光机,你就可以做到。这本书写于 2012 年,但
scoped_lock直到 2017 年才推出。 -
您能否形成一个答案@FrançoisAndrieux,这正是我要问的。 tnx
标签: c++ multithreading c++11 mutex deadlock