【发布时间】:2009-10-22 13:51:50
【问题描述】:
在什么情况下让两个不同的线程同时写入 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.
}
注意:我知道,即使这是安全的,它有时也会导致缓存的错误共享问题,从而导致性能下降。但是,对于我所考虑的用例,写入频率将不高,这在实践中并不重要。
编辑:不要担心读回写入的值。假设是在读取任何值之前将同步。我只关心这种方式写作的安全性。
【问题讨论】:
-
我假设您正在查看相邻地址的脏写?
标签: multithreading thread-safety parallel-processing d race-condition