我是这门语言的新手,所以请耐心等待。我很好奇GO如何处理线程可用的数据存储,因为非局部变量也可以是非volatile的,例如在Java中。GO有channel的概念,从本质上讲——线程间通信,意味着它绕过处理器缓存,直接读/写到堆。另外,在golang文档中没有找到任何对volatile的引用。 最佳答案 TL;DR:Go没有关键字可以让多个goroutine安全地写入/读取变量。为此,请使用sync/atomic包。或者更好Donotcommunicatebysharingmemory;instead,sharememorybyc
这个问题在这里已经有了答案:Whatisthevolatilekeywordusefulfor?(25个回答)Whatisthe"volatile"keywordusedfor?(8个回答)关闭3年前。我已阅读“Whentouse'volatile'inJava?”,但我仍然感到困惑。我如何知道何时应该将变量标记为volatile?如果我弄错了,要么在需要它的东西上省略volatile,要么在不需要的东西上添加volatile怎么办?在确定多线程代码中哪些变量应该是volatile时,有哪些经验法则? 最佳答案 当你想让一个成员变量
这个问题在这里已经有了答案:Whatisthedifferencebetweenatomic/volatile/synchronized?(7个回答)关闭9年前。我在下面的某处读到。Javavolatilekeyworddoesn'tmeansatomic,itscommonmisconceptionthatafterdeclaringvolatile,++operationwillbeatomic,tomaketheoperationatomicyoustillneedtoensureexclusiveaccessusingsynchronizedmethodorblockinJav
如果我只使用get()和set()-来自AtomicReference的方法? 最佳答案 简短的回答是:不。来自java.util.concurrent.atomic包文档。引用:Thememoryeffectsforaccessesandupdatesofatomicsgenerallyfollowtherulesforvolatiles:gethasthememoryeffectsofreadingavolatilevariable.sethasthememoryeffectsofwriting(assigning)avolat
根据我从HerbSutter中读到的内容和others你会认为volatile和并发编程是完全正交的概念,至少就C/C++而言。然而,在GCCimplementation全部std::atomic的成员函数有volatile限定符。AnthonyWilliams的implementation也是如此。的std::atomic.那么有什么关系,做我的atomic变量需要volatile还是不行? 最佳答案 总结别人写的正确:C/C++volatile用于硬件访问和中断。C++11atomic用于线程间通信(例如,在无锁代码中)。这两个
是否允许编译器对此进行优化(根据C++17标准):intfn(){volatileintx=0;returnx;}这个?intfn(){return0;}如果是,为什么?如果没有,为什么不呢?这里有一些关于这个主题的思考:当前的编译器将fn()编译为一个放在堆栈上的局部变量,然后返回它。例如,在x86-64上,gcc创建:movDWORDPTR[rsp-0x4],0x0//thisisxmoveax,DWORDPTR[rsp-0x4]//eaxisthereturnregisterret现在,据我所知,标准并没有说应该将局部volatile变量放入堆栈。所以,这个版本同样好:moved
我了解volatile通知编译器该值可能会改变,但是为了完成这个功能,编译器是否需要引入一个内存栅栏才能使其工作?据我了解,对volatile对象的操作顺序不能重新排序,必须保留。这似乎意味着一些内存围栏是必要的,并且没有真正的解决方法。我这样说对吗?thisrelatedquestion上有一个有趣的讨论。JonathanWakelywrites:...Accessestodistinctvolatilevariablescannotbereorderedbythecompileraslongastheyoccurinseparatefullexpressions...rightth
我对volatile和mutable之间的区别有疑问。我注意到这两者都意味着它可以改变。还有什么?它们是一样的吗?有什么不同?它们适用于什么地方?为什么提出这两个想法?如何以不同的方式使用它们?非常感谢。 最佳答案 即使在通过const指针或引用访问的对象中,或在const对象中,也可以更改mutable字段,因此编译器知道不将其存储在R/O内存中。volatile位置是可以由编译器不知道的代码(例如某些内核级驱动程序)更改的位置,因此编译器知道不进行优化,例如在该值“不可能改变”的无效假设下对该值的寄存器分配,因为它最后一次加载到
如果我有:structwhatever{intdata;};volatilewhatevertest;test.data也会易变吗? 最佳答案 可以提出另一个问题(或者只是以另一种方式查看原始问题):是否制作一个结构const使其所有成员const?如果我有:structwhatever{intdata;};constwhatevertest;test.data也会是const吗?我的回答是:是的。如果你用const声明一个whatever类型的对象,那么它的所有成员也将是const同样,如果你用volatile声明一个whatev
如thisanswer中所示我最近发布了,我似乎对volatile在多线程编程上下文中的实用性(或缺乏实用性)感到困惑。我的理解是:任何时候一个变量可能在一段代码访问它的控制流之外被改变,这个变量应该被声明为volatile。信号处理程序、I/O寄存器、被另一个线程修改的变量都构成了这种情况。因此,如果您有一个全局intfoo,并且foo由一个线程读取并由另一个线程以原子方式设置(可能使用适当的机器指令),则读取线程看到这种情况的方式与看到由信号处理程序调整或由外部硬件条件修改的变量相同的方式,因此foo应该声明为volatile(或者,对于多线程情况,通过内存隔离负载访问,这可能是更