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 排版