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。

最新文章

  1. 字符串转换为数字---使用java7的装箱功能
  2. springmvc 用注解方式添加事务不生效解决方法
  3. Eclipse较为常用快捷键
  4. vb6 枚举对象属性
  5. #define 的一些用法 以及 迭代器的 [] 与 find()函数的区别
  6. Linux 执行ThinkPHP 文件的计划任务
  7. angularJs自定义指令时的绑定
  8. JavaWeb高性能开发(一)
  9. C#中自定义消息,与MFc对比
  10. 为TListBox添加水平滚动条
  11. ZOJ3819 ACM-ICPC 2014 亚洲区域赛的比赛现场牡丹江司A称号 Average Score 注册标题
  12. _2_head_中标签
  13. PBCS项目总结
  14. Oracle EBS FA 本年折旧
  15. ElasticSearch6.5.0 【字段类型】
  16. elasticsearch6.7 05. Document APIs(6)UPDATE API
  17. 第三个spring冲刺第5、6、7天(三天汇总)
  18. django-templates过滤器
  19. Promise初探
  20. 用ASP.NET/C#连接Access和SQL Server数据库

热门文章

  1. 【leetcode】Valid Palindrome II
  2. IDEA mapping箭头要怎么样设置哈(Free MyBatis插件)
  3. VMWare虚拟机启动不了有个叉叉的解决办法
  4. js 获取 URL的参数 session
  5. Tensorflow视频教程&amp;Pytorch视频教程
  6. Task的用法
  7. Selenium 多表单(frame/iframe)切换
  8. java8 for循环了改为 流
  9. Oracle-执行./runInstaller报错,弹不出图形界面
  10. [LeetCode]-DataBase-Trips and Users