C++使用锁注意事项

902 阅读2分钟

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