多线程mute/lock_guard/unique_lock/condition_variable访问同一公共资源

        多线程中有时需要锁住一个公共资源,使得多线程处理的同一块代码区时按照顺序执行,这时需要使用加锁,加锁的方法:mute方、lock_guard、unique_lock、contionditon_varibale,每个方法使用的场景不同。

1、C++11中提供了std::mutex互斥量,共包含四种类型:
std::mutex:最基本的mutex类。
std::recursive_mutex:递归mutex类,能多次锁定而不死锁。
std::time_mutex:定时mutex类,可以锁定一定的时间。
std::recursive_timed_mutex:定时递归mutex类。

mutex var1
var1.lock();//上锁
//function()加锁后操作
var1.unlock();//解锁

mute在多线程中的使用可以参考C++:mutex库_aixintianshideshouhu的博客-CSDN博客_mutex

上述的代码中的function若出现异常,则会出现死锁;若使用lock_guard就不会存在死锁问题。

2、std::lock_guard是锁管理器,它将尝试获取提供给它的互斥锁的所有权。当控制流离开lock_guard对象的作用域时,lock_guard析构并释放互斥量。

{mutex var1
std::lock_guard<std::mutex>lockVar(var1);
//function()加锁后操作
}

上述代码中,加锁后,就算执行function出现异常,当程序执行完{}内容后,lockVar生存周期结束,就不会出现死锁问题。

3、std::unique_lock是另一种锁管理器,它拥有lock_guard的功能,但比其功能更强大。

lock_guard和unique_lock的在多线程中的使用可以参考c++11中的lock_guard和unique_lock使用浅析_guotianqing的博客-CSDN博客

4、std::condition_variable 是条件变量,常用的函数有wait。wait作用是用std::unique_lock锁住当前线程,当前线程会一直被阻塞,直到另外一个线程在相同的 std::condition_variable 对象上调用了 notification 函数来唤醒当前线程。

(1)wait(unique_lock <mutex>&lck)

        当前线程的执行会被阻塞,直到收到 notify 为止。

(2)wait(unique_lock <mutex>&lck,Predicate pred)

        当前线程仅在pred=false时阻塞;如果pred=true时,不阻塞。

        wait()可依次拆分为三个操作:释放互斥锁、等待在条件变量上、再次获取互斥锁。

std::condition_variable在多线程的使用可参考C++11 并发指南五(std::condition_variable 详解) - Haippy - 博客园 (cnblogs.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值