C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – Windows VisualC上的易读性和写入原子?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在这个网站上有几个问题,询问是否可以使用volatile变量进行原子/多线程访问:例如,参见 here,here,or here.

现在,C()标准符合答案显然是没有的.@H_301_3@

但是,在Windows& Visual C编译器,情况似乎不是那么清楚.@H_301_3@

我最近answered引用了official MSDN docs的volatile@H_301_3@

现在看这个,在我看来,一个volatile变量将被MS编译器处理,因为Std :: atomic将在即将到来的C11标准中.@H_301_3@

然而,在comment to my answer,用户Hans Passant写道:“MSDN文章是非常不幸的,它是错误的,你不能实现一个挥发性的锁,甚至没有微软的版本(…)”@H_301_3@

请注意:MSDN中给出的示例似乎很有腥味,因为您通常不会实现无原子交换的锁定. (也是@L_772_18@.)这仍然是问题wrt.对MSDN文章中给出的其他信息的有效性,特别是对于herehere的用例.)@H_301_3@

另外,有Interlocked *函数的文档,特别是InterlockedExchange,它具有一个volatile(!?)变量,并进行原子读写. (请注意,我们对SO-When should InterlockedExchange be used?一个问题 – 不会授权回答此功能是否需要只读或只写原子访问.)@H_301_3@

更重要的是,上面引用的易失性文档以“全球或静态对象”的形式引用,我认为“真实”@L_404_13@应该适用于所有价值观.@H_301_3@

回到问题@H_301_3@

在Windows上,使用Visual C(2005 – 2010年),将声明一个(32位?int?)变量作为volatile允许原子读取和写入此变量?@H_301_3@

对我来说特别重要的是,这应该保持(或不)在Windows / VC上独立于程序运行的处理器或平台. (就是说,它是WinXP / 32bit还是Windows 2008R2 / 64bit运行在Itanum2上?)@H_301_3@

请用可验证的信息,链接,测试用例来备份您的答案!@H_301_3@

解决方法

是的,它们在windows / vc上是原子的(假设你符合对齐要求等等)

但是对于一个锁,你需要一个原子测试和设置,或比较和交换机制或类似的,而不仅仅是一个原子更新或阅读.@H_301_3@

否则,无法测试锁并在一个不可分割的操作中声称它.@H_301_3@

编辑:如下所述,32位或以下的x86上的所有对齐的内存访问都是原子的.关键是易失性使内存访问有序. (感谢您在评论中指出这一点)@H_301_3@

大佬总结

以上是大佬教程为你收集整理的c – Windows VisualC上的易读性和写入原子?全部内容,希望文章能够帮你解决c – Windows VisualC上的易读性和写入原子?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:c写入原子