- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
To serialize access, protect the data with channel operations or other synchronization primitives such as those in the sync and sync/atomic packages.
还有 sync package说
Package sync provides basic synchronization primitives such as mutual exclusion locks
所以由此我们可以得出结论,sync.Mutex
是一个同步原语。还有一个非常强烈的暗示,即该包中的其他类型是同步原语。但是,它没有明确说明例如sync.WaitGroup
是。
阅读source of WaitGroup ,我无法完全说服自己内存操作不会围绕 WaitGroup
函数重新排列(例如,我可以使用 java 的 synchronized
关键字进行重新排列)。我相信它是在序列化之前/之后,但我怎么能确定。
sync.WaitGroup
是“同步原语”吗?我不是简单地寻找"is"(或“否”)的答案,而是寻找可以证明这一点的指针。
最佳答案
如果违背明智advice一路跟着海龟下去……
wg.Add()导致第 63 行导致 atomic.AddUint64()这导致了这个汇编代码:
LOCK
XADDQ AX, 0(BP)
另一方面wg.Wait()导致第 121 行导致 atomic.CompareAndSwapUint64()这导致:
LOCK
CMPXCHGQ CX, 0(BP)
这显然是您构建 WaitGroup
的方式:)。使用锁定原子交换和添加和锁定原子比较和交换。对我来说很有说服力。你无法对抗汇编器。好吧也许你可以我不能。
关于 x86 locks
关于multithreading - sync.WaitGroup 是 "synchronization primitive"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47761700/
这只是一个练习,但我无法弄清楚其中的歧义: private static void flipFlop(String str, int i, Integer iRef) { System.out.pri
我假设 jls 中描述的转换是根据优先级排序的。首先具有更高的优先级。 jls 因此我解决了 Boxing 比 Unboxing 具有更高的优先级。我决定检验这个假设。 研究以下代码: public
我的问题看起来很简单。 int i =99999; long square = i*i; System.out.println(square); //prints 1409865409 - inc
我有一种情况,我必须更改 java 常量。 我有下面的代码工作 import java.lang.reflect.Field; import java.lang.reflect.Modifier; p
Section 4.2 of the Java Language Specification指出,“原始值不与其他原始值共享状态”。这到底是什么意思? 最佳答案 这意味着原始类型的每个值都在内存中占据
我想将对原始类型的引用传递给一个方法,这可能会改变它。 考虑以下示例: public class Main { Integer x = new Integer(42); Integer
为了学习依赖类型,我正在用 Idris 重写我的旧 Haskell 游戏。目前游戏“引擎”使用内置的整数类型,例如 Word8 .我想证明一些涉及这些数字的数字属性的引理(例如,双重否定是身份)。但是
我从react-primitives自述文件https://github.com/lelandrichardson/react-primitives#readme中读取内容,指出我们需要安装目标平台库
让我们以jackson序列化器为例,假设我们有一个这样的类: public class Car { private String brand; private Integer weig
出于某种原因,我想做这样的事情: template void write(const Data& data) { std::fstream out {...}; out.write(r
由于 C# 中的 struct 由其成员的位组成,因此您不能拥有包含任何 T 字段的值类型 T: // Struct member 'T.m_field' of type 'T' causes a c
这个问题在这里已经有了答案: Why does int i = 1024 * 1024 * 1024 * 1024 compile without error? (5 个回答) 关闭8年前。 在Jav
在好几个地方我都看到了类似这样的声明: “Scala 编译器在编译代码中尽可能使用 Java 数组、基本类型和 native 算术”(《Scala 编程》一书)。但实际上我没有看到这一点,例如在下面的
术语“同步原语”到底是什么意思?例如:互斥锁,关键部分,等待计时器,事件,监视器,条件变量,信号量。它们都是同步原语吗?我还没有列出其他同步原语吗?这些是有效的问题吗? 最佳答案 同步原语是平台(例如
我正在通读 Rubinius source code ,我不断遇到类似这样的方法: def self.do_something Rubinius.primitive :vm_do_somethin
我正在用解释器编写类似 Scheme 的程序。类似 Scheme 的解释器应该可以很好地与任何实现 IEnumerable 的对象一起工作,这似乎很自然。 解释器不允许突变 - 没有暴露有副作用的函数
ASP.NET Web Api 函数返回一个简单的 JSON 字符串。 当我从 angularjs 调用这个函数时,我得到一个带引号的字符串,而不是一个简单的字符串: return $http.pos
我正在将一个项目(不是我最初的项目)从 python2 转换为 python3。 在我的一个脚本中: sk = (key.Sub[0]/["point", ["_CM"]]).value 这适用于 p
我在一周前运行良好的应用程序中实现了指纹身份验证。没有更改代码,我现在收到以下错误: FATAL EXCEPTION: main Caused by: java.lang.IllegalSta
我在从 URL 接收 JSON 数组时遇到问题。我已经验证我的链接没问题,并且返回了正确的 JSON 数组,它甚至显示在错误消息中。我不确定这是什么意思。 错误: 04-17 21:34:04.435
我是一名优秀的程序员,十分优秀!