在什么情况下让两个不同的线程同时写入 x86 上同一数组的相邻元素是不安全的?我知道在某些具有疯狂内存模型的类似 DS9K 的架构上,这可能会导致字撕裂,但在 x86 上,单个字节是可寻址的。例如,在 D 编程语言real
中是 x86 上的 80 位浮点类型。执行以下操作是否安全:
real[] nums = new real[4]; // Assume new returns a 16-byte aligned block.
foreach(i; 0..4) {
// Create a new thread and have it do stuff and
// write results to index i of nums.
}
注意:我知道,即使这是安全的,它有时也会导致缓存的错误共享问题,从而导致性能下降。但是,对于我想到的用例,写入将很少见,以至于这在实践中并不重要。
编辑:不要担心读回写入的值。假设是在读取任何值之前会有同步。我只关心这样写的安全性。