1.3.1 mutex 不是办法
mutex 只能保证函数一个接一个地执行,考虑下面的代码,它试图用互斥锁来保护析构函数:(注意代码中的(1) 和(2) 两处标记。)
|
|
尽管线程A 在销毁对象之后把指针置为了NULL,尽管线程B 在调用x 的成员函数之前检查了指针x 的值,但还是无法避免一种race condition:
1. 线程A 执行到了析构函数的(1) 处,已经持有了互斥锁,即将继续往下执行。
2. 线程B 通过了if (x) 检测,阻塞在(2) 处。
接下来会发生什么,只有天晓得。因为析构函数会把mutex_ 销毁,那么(2) 处有可能永远阻塞下去,有可能进入“临界区”,然后core dump,或者发生其他更糟糕的情况。
这个例子至少说明delete 对象之后把指针置为NULL 根本没用,如果一个程序要靠这个来防止二次释放,说明代码逻辑出了问题。

