学习笔记(05):c++11并发与多线程-互斥量概念、用法、死锁演示及解决详解

立即学习:https://edu.csdn.net/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一次锁住多个互斥量。

建议一个一个锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值