在并行编程中,常常看到类似如下的声明
private volatile Int32 m_flag = 0;
声明中有一个volatile关键字。
这个关键字的作用是告诉编译器,请不要优化该变量。在Release模式下,编译器可能会对代码做一定程度的优化,比如它会把某个常用的变量存放到CPU寄存器中,(有时候,并不一定是编译器所做的优化,而是硬件直接支持这种方式),这样的目的是为了加快速度,提高性能。
在单线程环境下,这种优化很有效。但是在多线程环境下,可能会引发bug。
比如A线程,设置m_flag值的时候,是从CPU寄存器中直接读取并设置,而在内存中该值并未同步。而B线程此时正在从内存中获得该值,这样获得的值就不正确了。
因此,声明的时候用volatile表示,要求程序在内存中读写这个值,而不放到CPU寄存器中,避免发生bug。
本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/527292 ,如需转载请自行联系原作者