微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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这样的弱一致的内存架构,编写一些测试代码,并比较编译器生成内容与您需要的内容以确保写入对其他进程可见.

原文地址:https://www.jb51.cc/c/112681.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐