C 11 中的易失性:弃用还是适应?
在 C 11 标准中,从单线程到多线程的转变线程机器模型提出了一个问题:C 98/03 中优化读取的常见示例在 C 11 中仍然是一个问题吗?
单线程与多线程注意事项
C 98/03 内存模型假设单线程环境,忽略了并发访问变量的可能性。因此,编译器可以优化对标记为“static int x;”的变量的读取,如示例代码中所示。
但是,C 11 引入了多线程内存模型,承认并发变量访问的潜力。然而,该模型没有明确考虑或阻止优化的读取行为。
Volatile:定义范围
Volatile 是 C 98 中添加的一个关键字,用于解决硬件内存访问优化。它指示编译器变量可以在外部更改,并且不应被优化掉。
在 C 11 的多线程模型的上下文中,易失性不会直接影响线程行为。它仅确保从变量读取的内存不会被优化掉。但是,这并不能保证来自另一个线程的可见更改。
内存完整性和原子性
C 11 的内存模型侧重于内存完整性而不是线程行为。对变量的非原子访问(不包括 std::atomics 和互斥体)会导致未定义的行为。即使具有易失性,如果另一个线程在没有正确同步的情况下修改变量,仍然会发生未定义的行为。
同步和内存屏障
对于多线程通信,C 11 提供了特定的语言构造调用内存障碍。这些屏障强制不同内核之间的数据同步,并确保跨线程的数据写入的可见性。 Volatile 不提供此功能。
结论
在 C 11 中,非原子访问的优化读取问题仍然存在。线程考虑因素仍然至关重要,并且使用互斥体或 std::atomics 的正确同步机制可确保定义的行为。虽然易失性可能会阻止内存读取优化,但它不能解决线程问题或保证跨线程的可见数据更改。
以上是'易失性”在 C 11 的多线程世界中仍然相关吗?的详细内容。更多信息请关注PHP中文网其他相关文章!