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

C++编程中,有一些实用的注意事项可以帮助你编写更高效、可维护和安全的代码。以下是几个关键点: 1. **类型转换**:使用`static_cast`, `dynamic_cast`, `const_cast`, 和 `reinterpret_cast`时要小心,确保类型转换的正确性和意图。滥用类型转换可能导致运行时错误或性能损失。 2. **内存管理**:手动管理内存(使用new, delete,指针等)时要避免内存泄漏和悬挂指针。使用智能指针(如`shared_ptr`, `unique_ptr`, 或`std::optional`)可以简化内存处理。 3. **异常处理**:尽量遵循"异常不应被忽视"的原则,用`try-catch`块捕获并处理可能的异常。同时,避免在finally块中释放资源,因为这可能导致资源在异常发生后未得到正确的清理。 4. **命名规范**:遵循一致的命名约定,比如成员变量使用小驼峰式(`camelCase`),函数和类使用大驼峰式(`PascalCase`)。 5. **模板编程**:C++模板可以生成灵活的代码,但过度使用可能导致代码复杂度增加。确保模板参数的数量适中,并为模板提供明确的文档。 6. **RAII(Resource Acquisition Is Initialization)**:利用RAII原则,确保在对象生命周期结束时自动释放资源,例如文件、或动态分配的内存。 7. **范围-based for循环**:对于迭代容器,使用范围-based for循环比传统的迭代器更简洁易读。 8. **STL**:充分利用标准模板库(STL),它提供了高效的数据结构和算法,可以提高代码质量。 9. **避免全局变量**:尽可能减少全局变量,它们增加了耦合度和测试的复杂性。 10. **代码复用**:合理地设计类和模块,以促进代码的复用和模块化。 相关问题: 1. 何为RAII原则? 2. 使用范围-based for循环有何优点? 3. C++中为什么要避免全局变量?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值