是否有任何通常遵循的标准(ISO C或C,或
任何POSIX / SUS规范),一个变量(也许
标记为volatile),不被互斥体保护,正在被访问
多线程将成为最终一致如果是
分配给?
任何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关键字的任何人来说 – 挥之不去的保证,编译器不会生成显式地将数据缓存在寄存器中的代码,但这与处理透明地缓存/重新排序读取和写入的硬件不同.阅读例如this或this或this Dr Dobbs博士文章或this SO问题的答案,或者选择您喜欢的编译器,目标是像Cell这样的弱一致的内存架构,编写一些测试代码,并比较编译器生成的内容与您需要的内容以确保写入对其他进程可见.