我是这门语言的新手,所以请耐心等待。
我很好奇 GO 如何处理线程可用的数据存储,从某种意义上说,非局部变量也可以是非易失性的,例如在 Java 中。
GO 有通道的概念,从本质上讲,线程间通信意味着它绕过处理器缓存,直接读/写堆。
另外,在 go lang 文档中没有找到任何对 volatile 的引用。
TL;DR:Go 没有关键字来使变量对于多个 goroutine 写入/读取它是安全的。使用sync/atomic
包为此。或者更好不要通过共享内存进行通信;相反,通过通信来共享内存 http://blog.golang.org/share-memory-by-communicating.
Two answers for the two meanings of volatile http://www.drdobbs.com/parallel/volatile-vs-volatile/212701484
.NET/Java并发性
部分摘录自Go内存模型 http://golang.org/ref/mem.
如果一个 Goroutine 的效果必须由另一个 Goroutine 观察,
使用同步机制,例如锁或通道
通信以建立相对顺序。
例子之一来自同步不正确 http://golang.org/ref/mem#tmp_9部分是繁忙等待值的示例。
更糟糕的是,不能保证写入完成会永远
由 main 观察,因为之间没有同步事件
两个线程。 main 中的循环不能保证完成。
事实上,这段代码(play.golang.org/p/K8ndH7DUzq http://play.golang.org/p/K8ndH7DUzq)永远不会退出。
C/C++ 非标准内存
Go 的内存模型没有提供解决非标准内存的方法。如果您可以对设备的 I/O 总线进行原始访问,则需要使用汇编语言或 C 语言将值安全地写入内存位置。我只需要在设备驱动程序中执行此操作,这通常会阻止使用 Go。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)