aroncc

Results 2 comments of aroncc

> @caonann > 有点疑惑,例子一中说”在 thread1 中,flag = false 赋值之后,在 while 死循环里,没有任何机会修改 flag 的值“,但是自己实现了个能运行的,并没测试出什么问题,请问是我哪里理解有误呢? > ``` > bool flag = false; > using Type=int; > > void test_volatile_demo() > { >...

作者给的第一个sample code后面的2点评论,我理解应该是不对的把。 1,关于if条件优化掉的问题,对于全局变量肯定不会发生,不管是在什么编译器版本上,因为编译器无法推断出全局变量的不变性,所以不会无端认为全局变量不变。(想了一下,加个条件,毕竟没有验证过,可以肯定的是:涉及到写的全局变量,肯定不会把if条件优化掉) 2,关于函数调用和变量赋值的乱序问题,也是不对的。对于编译优化,只有当编译器能够确定函数调用和赋值操作无关的情况下,才可能触发交换顺序。而实际上,编译器根本无法推断出函数调用和赋值操作的关系(是否互相影响),所以保守设计上,肯定不会选择交换顺序。就文中的例子而言,因为flag是全局变量,所以肯定不会交换顺序的(因为前面的函数调用显然也可以访问到这个全局变量,从而有机会影响flag的取值,如果编译器还交换顺序的话,那就大错了)。我可以给一个典型的反例:如果,上述代码放在单线程的程序中,那么也会有flag和函数调用的顺序交换吗?这显然是不可能的!如果如此,那么现在世界上的绝大部分的程序都会运行错误。 3,最后提一下cpu的乱序问题。在100%的情况下(除非极其特殊的场合),cpu的乱序不影响程序语义。这是cpu乱序设计的前提。换句话说,作为应用程序开发程序员,不应该考虑cpu乱序问题。同样的反例:如果真的有影响,那么历史上老的程序岂不是都不能正确跑了。显然,任何物理cpu都不会如此设计。 总结:作者给的结论应该是对的,只是举了一个不合适的例子,不知道能不能找到一个真实的例子。 因为像flag检查这样的代码,在程序开发中非常常见,所以,我有个问题,到底能不能这样用?似乎不用volatile程序也可以正常运行。我们到底可不可以这样写代码呢?能不能找一个使这样的代码失效的c++代码啊?作者大佬!