- 论坛徽章:
- 2
|
那我就说一下吧,当你加了volatile这样的标志,编译器不再把它当可随意存储的内存看待,必须从真实地址去读,并且不得改变读写顺序.
说白了,这就是对编译器的约束
cjaizss 发表于 2011-10-18 15:16
你俩对话真搞笑……
我也倾向于volatile也不行,但拿不出确实的证据。
我的理解是volatile只适合这种:
- int volatile* reg = (int*)0x?????;
- while (*reg);
复制代码 就是说:
1. volatile向编译器表达的是: 程序状态会被程序执行之外的因素改变
2. 而非volatile向编译器说明:只会由程序执行改变。
3. volatile可以保证能观察到程序执行(主线程)之外产生的改动。
但这里需要得到的保证是: enable与buffer之间改动的顺序,而非改动本身。
再没有得到volatile同时可以保证顺序的可靠证明(或证伪)前,我自己还是老老实实写个barrier吧……
大不了就是效率低点,但保证不错啊……
另外,一些不足以作证明的论据:
1. C/C++标准都是描述单线程行为的, volatile依然是在单线程下定义的, 没有过多考虑多线程的事
2. 所以C++11才会搞出很大的举动,想将内存模型标准化 —— 因为(相关文章很多)现有C/C++想编写正确的多线程程序很困难
3. volatile在msvc的各个版本之间定义不同
记得是vc8(vs2005)时改为volatile的写入会产生一个full barrier,这就可以保证顺序性。
也就是说,存在其他编译器(比如vc8之前)volatile是不会产生barrier,是不保证顺序性的。 |
|