立即学习:https://edu.youkuaiyun.com/course/play/9377/196524?utm_source=blogtoedu
1. 互斥量(mutex)基本概念
互斥量是个对象,如果多个线程试图锁住,那么只有一个线程可以锁成功。另一个线程等待并不断尝试。
使用互斥量正确的保护操作数据,不多也不少,少了,没达到保护效果,多了影响代码效率。
2.互斥量的用法
2.1lock(); unlock();
步骤:1)先lock;2)操作共享数据;3)unlock
lock和unlock成对使用。缺少unlock很难排查
C++引入了lock_guard类模板。你忘记不要紧,我替你unlock。
2.2 std::lock_guard类模板
std::lock_guart<mutex> submutex(mymutexName);
这个临时变量,构造里lock
析构里unlock
3. 死锁
3.1 死锁演示
两个线程、两个锁
一个线程lock1,lock2
另一个线程lock顺序相反
3.2 死锁的一般解决方案
lock顺序相同即可解决
3.3 std::lock()函数模板
避免死锁。
要么两个互斥量都锁住,要么都没锁住。
std::lock(mutex1,mutex2);
3.4 std::lock_guard的std::adopt_lock参数。
为了结合使用lock_guard和std::lock,同时避免忘记unlock和死锁
std::lock(mutex1,mutex2);
std::lock_guard<std::mutex> submutex1(mutex1,std::adopt_lock);
std::lock_guard<std::mutex> submutex1(mutex2,std::adopt_lock);
其中adopt_lock标记该互斥量已经被lock,不需要在构造中再次lock。
总结:std::lock一次锁住多个互斥量。
建议一个一个锁。