c – Windows VisualC上的易读性和写入原子?
在这个网站上有几个问题,询问是否可以使用volatile变量进行原子/多线程访问:例如,参见
here,here,or here.
现在,C()标准符合答案显然是没有的. 但是,在Windows& Visual C编译器,情况似乎不是那么清楚. 我最近answered引用了official MSDN docs的volatile
现在看这个,在我看来,一个volatile变量将被MS编译器处理,因为std :: atomic将在即将到来的C11标准中. 然而,在comment to my answer,用户Hans Passant写道:“MSDN文章是非常不幸的,它是错误的,你不能实现一个挥发性的锁,甚至没有微软的版本(…)” 请注意:MSDN中给出的示例似乎很有腥味,因为您通常不会实现无原子交换的锁定. (也是pointed out by Alex.)这仍然是问题wrt.对MSDN文章中给出的其他信息的有效性,特别是对于here和here的用例.) 另外,有Interlocked *函数的文档,特别是 更重要的是,上面引用的易失性文档以“全球或静态对象”的形式引用,我认为“真实”acquire/release semantics应该适用于所有价值观. 回到问题 在Windows上,使用Visual C(2005 – 2010年),将声明一个(32位?int?)变量作为volatile允许原子读取和写入此变量? 对我来说特别重要的是,这应该保持(或不)在Windows / VC上独立于程序运行的处理器或平台. (就是说,它是WinXP / 32bit还是Windows 2008R2 / 64bit运行在Itanum2上?) 请用可验证的信息,链接,测试用例来备份您的答案! 解决方法
是的,它们在windows / vc上是原子的(假设你符合对齐要求等等)
但是对于一个锁,你需要一个原子测试和设置,或比较和交换机制或类似的,而不仅仅是一个原子更新或阅读. 否则,无法测试锁并在一个不可分割的操作中声称它. 编辑:如下所述,32位或以下的x86上的所有对齐的内存访问都是原子的.关键是易失性使内存访问有序. (感谢您在评论中指出这一点) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |