c++学习之---volatile和线程安全的singleton模式

参考:http://www.cnblogs.com/rocketfan/archive/2009/12/05/1617759.html
volatile:
1.volatile的作用:
(1) the content of a volatile variable is “unstable” (can change by means unknown to the compiler),

(2) all writes to volatile data are “observable” so they must be executed religiously, and

(3) all operations on volatile data are executed in the sequence in which they appear in the source code.
1.被声明为volatile的变量其内容是不稳定的(unstable),它的值有可能由编译器所不能知晓的情况所改变。
2.所有对声明为volatile的变量的写操作都是可见的,必须严格执行be executed religiously。
3.所有对声明为volatile的变量的操作(读写)都必须严格按照源代码的顺序执行。
volatile确保每次直接从内存读取变量的值。java中的volatile是跨线程保证上述三个条件的,而C++只是单一线程内保证。
但是即使是JAVA能够跨越线程保证,仍然是不够的因为volatile和非volatile操作之间的顺序仍然是未定义的,有可能产生问题,考虑下面的代码:

volatile int vi;

void bar(void) {
vi = 1;
foo();
vi = 0;
}

我们一般会认为vi会在调用foo之前设置为1,调用完后会被置为0。然而编译器不会对你保证这一点,它会很高兴的将你的foo()移位,比如跑到vi = 1前面,只要它知道在foo()里不会涉及到其它的volatile操作。所以安全的方法是用栅栏memory barrier例如“asm volatile (”" ::: “memory”)加到foo的前面和后面 来保证严格的执行顺序。内存屏障保证代码执行时严格按照源代码的的顺序。

posted on 2011-03-09 11:47 MrRightLeft 阅读(746) 评论(0)  编辑 收藏 引用 所属分类: C/C++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年3月>
272812345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜