C++使用锁注意事项

C++使用锁注意事项


并发编程中,单线程中出现数据异常混乱的现象倒是没有,但是在多线程中,出现数据混乱等现象就比较 多了;在C++或者其他编程语言中,一般都会使用锁的方式来进行对数据保护;但是锁不是万能的,有时 候使用锁会导致效率低下、造成死锁等异常情况发生;


一般加锁原则: 不用锁>可重入锁>自动锁>手动锁


一般规则如下: 1、对象之间的依赖顺序是单向的,保障对象A的锁和对象B的锁是按顺序的 2、回调函数以及接口调用是可能影响单向性的,因此在触发回调和接口调用之前,需要手动释放锁 3、一个对象内部,强烈建议使用不要超过一把锁,虽然对性能是降低的,但是对避免死锁的可能性是有 好处的 4、一般情况下,使用可重入锁,避免一个线程内部自己锁住的问题


可重入锁的概念: 广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不 发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。


案例: 规则二:

{
 lock(a);
 callback_function(param);
 unlock(a);
}
 {  lock(a);  unlock(a);  callback_function(param); } 

规则三:

{
 lock(a);
 do_something_for_a();
 lock(b);
 do_something_for_b();
 unlock(b);  unlock(a); }  {  lock(a);  do_something_for_a();  do_something_for_b();  unlock(a); } 

规则四:

void foo()
{
 mutex.lock();
 // do something
 mutex.unlock();
}  void bar() {  mutex.lock();  // do something  foo();  mutex.unlock(); }  在同一线程上函数A是不会形成死锁的,但此时如果其他线程想要加锁,只有等待拥有锁的线程  释放所有的锁。(加锁几次要释放几次)  但是修改锁的属性为递归锁才能使用 

往期精彩文章汇总


想了解学习更多C++后台服务器方面的知识,请关注: 微信公众号:====CPP后台服务器开发====


冰冻三尺,非一日之寒,水滴石穿,非一日之功,愿我们一起加油努力~

本文使用 mdnice 排版

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值