举个例子,桌上有一支笔和一张纸,小A和小B都要拿到纸笔写字
小A拿了笔,小B拿了纸,这时就形成了死锁(两人都不愿意让出纸笔)。
其实只要稍加控制就可以避免这种情况:规定必须先拿到纸再能去尝试拿笔;
......
上面这个例子里相当于存在两个mutex,一个对纸进行“访问控制”(记作mutex1),一个对笔进行“访问控制”(记作mutex2);
小A的加锁顺序是mutex2, mutex1;
小B是mutex1, mutex2
很多情况都是不同线程对多个mutex加锁顺序不一致导致死锁发生
最简单的就是保证每个线程加锁的顺序都是一致的,
c++提供了一个方法std::lock,可以传入任意数量的lockable对象,然后c++使用某种死锁避免算法保证死锁不会发生
std::lock(mutex1, mutex2);
std::lock_guard<std::mutex> lock1(mutex1, std::adopt_lock);
std::lock_guard<std::mutex> lock2(mutex2, std::adopt_lock);
...
上面的lock_guard传入了std::adopt_lock参数,意在告诉lock对象mutex已经加锁了,lock_guard需要做的只是在离开作用域时调用unlock
原文:https://www.cnblogs.com/ChenLambda/p/11728570.html