两个线程读取同一块内存的不同区域是否安全?

3

以下是一个问题:是否安全部分地在多个线程中使用相同的内存块?

const
  BIFFER_SIZE = 1024;
var
  ABuffer :PChar;
  ABufferWrite :PChar;
  ABufferEnd :PChar;
begin
  GetMem(ABuffer, BUFFER_SIZE);
  ABufferEnd := ABuffer + BUFFER_SIZE;
  ABufferWrite := ABuffer + BUFFER_SIZE div 2;
end;

假设线程0在 [ABufferWrite..ABufferEnd] 范围内写入,而线程1在 [ABuffer..ABufferWrite-1] 范围内读取。
我认为这是可以的。我对吗?
2个回答

6

在正确性方面,两个线程访问不同内存区域没有问题。

可能会影响您的问题是由于伪共享导致的性能问题。您可以通过确保在两个内存区域之间至少有一个未使用的整个缓存行来避免这些问题。

如果您想了解更多关于伪共享的信息,我建议您阅读Herb Sutter的一篇文章:消除伪共享


2

看起来你已经安排好每个线程使用自己的一部分内存块,而不触及属于其他线程的部分。当然,这很好。由于线程没有共享内存的任何部分,因此你不需要任何同步。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接