在C/C++中,是否保证在线程之间最终具有一致的语义的易失性变量?

前端之家收集整理的这篇文章主要介绍了在C/C++中,是否保证在线程之间最终具有一致的语义的易失性变量?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否有任何通常遵循的标准(ISO C或C,或
任何POSIX / SUS规范),一个变量(也许
标记为volatile),不被互斥体保护,正在被访问
多线程将成为最终一致如果是
分配给?

要提供一个具体的例子,考虑两个线程共享一个
变量v,初始值为零.

主题1:
v = 1

线程2:
while(v == 0)
产量();

线程2是否最终终止终止?还是可以的
可以想象的永远是旋转的,因为缓存一致性不会踢
进入并使作业在线程2的缓存中可见?

我知道C和C标准(C 0x之前)不说话
所有关于线程或并发.但是我很好奇,如果C 0x
内存模型或pthreads或其他任何东西都保证了这一点.
(显然,这实际上在32位x86上的Windows上工作;我想知道它是否可以普遍依赖或者恰好在那里工作).

解决方法

这将取决于你的架构.虽然需要显式缓存刷新或内存同步以确保内存写入对其他线程可见,但并不排除它,但我确实遇到了平台(包括目前正在开发的基于PowerPC的设备),其中显式指令必须执行以确保状态被刷新.

请注意,线程同步原语(如互斥体)将根据需要执行必要的工作,但是您通常不需要线程同步原语,如果您想要的是确保状态是可见的,而不关心一致性 – 只是sync / flush指令将足够了.

编辑:对于仍然在讨论volatile关键字的任何人来说 – 挥之不去的保证,编译器不会生成显式地将数据缓存在寄存器中的代码,但这与处理透明地缓存/重新排序读取和写入的硬件不同.阅读例如thisthisthis Dr Dobbs博士文章this SO问题的答案,或者选择您喜欢的编译器,目标是像Cell这样的弱一致的内存架构,编写一些测试代码,并比较编译器生成内容与您需要的内容以确保写入对其他进程可见.

猜你在找的C&C++相关文章