只使用非递归的mutex
2024-09-05 02:04:12
mutex分为递归(以下简写为rm)和非递归(以下简写为nrm)两种,它们的唯一区别在于:同一个线程可以重复对rm加锁,但是不能重复对nrm加锁。
虽然rm使用起来要更加方便一些,并且不用考虑一个线程将自己锁死的问题,但是它可能会隐藏代码中的一些问题。例如:自以为拿到一个锁可以对对象进行修改时,外层代码已经拿到了锁,并且在此时正在修改这个对象。
MutexLock mutex;
vector<Foo> foos; void post(const Foo& f)
{
MutexLockGuard lock(mutex);
foos.push_back(f);
} void traverse()
{
MutexLockGuard lock(mutex);
for (vector<Foo>::const_iterator it = foos.begin(); it != foos.end(); ++it)
{
/*
假设Foo::doit()会间接调用post。
*/
it->doit();
}
}
此时若假设mutex是递归的,将会出现死锁的情况。
若mutex是非递归的,push_back可能会导致vector迭代器失效,从而导致程序崩溃。
由于死锁更容易debug,因此使用nrm可以更快速的找到代码的逻辑错误进行修改。
此时有两种改进方式:一是把对foos的修改推后,先记录要修改的元素,等遍历完foos后再进行修改;二是copy-on-write。
最新文章
- 字符串转换为数字---使用java7的装箱功能
- springmvc 用注解方式添加事务不生效解决方法
- Eclipse较为常用快捷键
- vb6 枚举对象属性
- #define 的一些用法 以及 迭代器的 [] 与 find()函数的区别
- Linux 执行ThinkPHP 文件的计划任务
- angularJs自定义指令时的绑定
- JavaWeb高性能开发(一)
- C#中自定义消息,与MFc对比
- 为TListBox添加水平滚动条
- ZOJ3819 ACM-ICPC 2014 亚洲区域赛的比赛现场牡丹江司A称号 Average Score 注册标题
- _2_head_中标签
- PBCS项目总结
- Oracle EBS FA 本年折旧
- ElasticSearch6.5.0 【字段类型】
- elasticsearch6.7 05. Document APIs(6)UPDATE API
- 第三个spring冲刺第5、6、7天(三天汇总)
- django-templates过滤器
- Promise初探
- 用ASP.NET/C#连接Access和SQL Server数据库
热门文章
- 【leetcode】Valid Palindrome II
- IDEA mapping箭头要怎么样设置哈(Free MyBatis插件)
- VMWare虚拟机启动不了有个叉叉的解决办法
- js 获取 URL的参数 session
- Tensorflow视频教程&;Pytorch视频教程
- Task的用法
- Selenium 多表单(frame/iframe)切换
- java8 for循环了改为 流
- Oracle-执行./runInstaller报错,弹不出图形界面
- [LeetCode]-DataBase-Trips and Users