dsi*_*cha 10 parallel-processing multithreading d thread-safety race-condition
在什么情况下,让两个不同的线程同时写入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.
}
Run Code Online (Sandbox Code Playgroud)
注意:我知道,即使这是安全的,它有时也会导致缓存的错误共享问题,从而导致性能降低.但是,对于我想到的用例,写入的内容很少,实际上并不重要.
编辑:不要担心读回写入的值.假设在读取任何值之前将存在同步.我只关心这种写作的安全性.
Ira*_*ter 10
x86具有连贯的缓存.写入高速缓存行的最后一个处理器获取整个事物并写入高速缓存.这可确保写入相应值的单字节和4字节值以原子方式更新.
这与"它的安全"不同.如果处理器每个只按设计写入由该处理器"拥有"的字节/ DWORDS,则更新将是正确的.实际上,您希望一个处理器读取其他人写入的值,这需要同步.
它也不同于"高效".如果多个处理器可以分别写入高速缓存行中的不同位置,则高速缓存行可以在CPU之间进行乒乓,这比高速缓存行转到单个CPU并保持在那里要贵得多.通常的规则是将特定于处理器的数据放在其自己的缓存行中.当然,如果你只打算写一个单词,只需要一次,并且与缓存行移动相比工作量很大,那么你的表现是可以接受的.
| 归档时间: |
|
| 查看次数: |
2743 次 |
| 最近记录: |