volatile是否真的在并发编程中没用?

时间:2016-04-09 16:33:47

标签: c multithreading

根据Linux文档(https://www.kernel.org/doc/Documentation/volatile-considered-harmful.txt),volatile在并发编程方面永远不会有用。 如果你坚持使用C11标准,我同意这是真的。标准字面上禁止在抽象机器没有接触它的位置上修改存储器位置,但是在C89和C99中不是这种情况。符合C89 / C99的编译器可以通过添加一些"发明的"来自由地优化代码。存储到共享变量,在C代码中没有对变量进行任何操作(因此它在临界区之外)。因此,正确同步线程间数据的唯一方法是将所有共享数据标记为易失性,另外应用锁或互斥锁。为什么Linux开发人员忽略了这一点?

来自C11的注释,C89和C99中没有: 注13:本标准通常排除了引入可能由抽象机器修改的潜在共享内存位置的编译的编译器转换,因为在抽象的情况下,这样的赋值可能会覆盖另一个线程的另一个赋值。机器执行不会遇到数据竞争。这包括覆盖不同内存位置中相邻成员的数据成员分配的实现。在有问题的原子可能混淆的情况下,我们通常也会排除原子载荷的重新排序,因为这可能违反了可见的序列"规则。

0 个答案:

没有答案