设为首页 加入收藏

TOP

1.3.1 mutex 不是办法
2013-10-07 16:01:03 来源: 作者: 【 】 浏览:69
Tags:1.3.1 mutex 不是 办法

1.3.1 mutex 不是办法

mutex 只能保证函数一个接一个地执行,考虑下面的代码,它试图用互斥锁来保护析构函数:(注意代码中的(1) 和(2) 两处标记。)

 
此时,有A、B 两个线程都能看到Foo 对象x,线程A 即将销毁x,而线程B 正准备调用x->update()。
 

尽管线程A 在销毁对象之后把指针置为了NULL,尽管线程B 在调用x 的成员函数之前检查了指针x 的值,但还是无法避免一种race condition:

1. 线程A 执行到了析构函数的(1) 处,已经持有了互斥锁,即将继续往下执行。

2. 线程B 通过了if (x) 检测,阻塞在(2) 处。

接下来会发生什么,只有天晓得。因为析构函数会把mutex_ 销毁,那么(2) 处有可能永远阻塞下去,有可能进入“临界区”,然后core dump,或者发生其他更糟糕的情况。

这个例子至少说明delete 对象之后把指针置为NULL 根本没用,如果一个程序要靠这个来防止二次释放,说明代码逻辑出了问题。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.2 对象的创建很简单 下一篇1.3.2 作为数据成员的mutex 不能..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·MySQL 安装及连接-腾 (2025-12-25 06:20:28)
·MySQL的下载、安装、 (2025-12-25 06:20:26)
·MySQL 中文网:探索 (2025-12-25 06:20:23)
·Shell脚本:Linux Sh (2025-12-25 05:50:11)
·VMware虚拟机安装Lin (2025-12-25 05:50:08)