一直都没有使用过volatile这个修饰符,也经常听说使用和不使用是一样的,也许大多数情况下是一样的,但是我今天读到了一个必须使用volatile的例子.
[POSA2]P220 讲述 双检查加锁优化 的时候,最终的范例代码是这个样子的:
class Singeton{
public:
static Singleton* instance()
{
if(instance_==0) {
Guard<Thread_Mutex> guard(singleton_lock_);
if(instance_==0)
instance_=new Singleton;
}
return instance_;
}
private:
static Singleton* instance_;
........
}
作者在后面补充到,在高度优化的编译器可能会以为第二个对flag==0的检查是多余的,而将它优化掉.解决这个问题的方法之一就是将该标志生命为volatile数据,以确保编译器不会过分的优化而改变程序的语义.
eg: static Singleton* volatile instance_;