C 11 中的易失性
C 11 标准引入了多线程机器模型,引发了对其对变量优化影响的质疑。具体来说,优化输出读取静态变量的经典示例(例如 static int x; void func() { x = 0; while (x == 0) {} })受到质疑。
多线程模型是否消除了优化问题?
与预期相反,C 11 内存模型并不能保证解决这个问题。虽然多线程模型认识到变量更改的可能性,但它不假设原子操作或考虑线程行为。
Volatile 的作用
Volatile 不解决线程行为;相反,它会阻止内存读取优化。然而,这并不能保证多线程的正确性。 CPU 缓存和内存访问同步需要内存屏障,而 volatile 不提供。
多线程访问中的未定义行为
没有适当的同步机制(例如互斥体、原子变量),非原子内存访问(例如示例代码中)会在 C 11 中产生未定义的行为。两个线程必须合作以确保内存完整性。
同步和内存完整性
C 11 内存模型定义了触发一个线程中的写入对其他线程的可见性的特定操作。通过锁定或排序进行同步可确保内存完整性。
示例分析
在提供的示例中,没有同步或依赖排序,导致数据争用和未定义的行为.
结论
C 11 中的多线程模型并没有消除对多线程正确性的原子操作或同步的需要。单独使用 volatility 并不能保证多线程安全;它只会阻止内存读取优化。正确使用同步机制对于可靠的多线程应用程序仍然至关重要。
以上是C 11 的多线程模型是否解决了易失变量的优化问题?的详细内容。更多信息请关注PHP中文网其他相关文章!