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] 之间进行读取。

我认为没关系。我对吗?

4

2 回答 2

6

就正确性而言,两个线程访问不同的内存区域没有问题。

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

如果您想了解更多关于虚假分享的信息,请参阅 Herb Sutter 关于该主题的一篇文章:消除虚假分享

于 2013-06-11T13:25:21.190 回答
2

看起来您已经安排每个线程都在使用自己的内存块部分,而不会触及属于另一个线程的部分。当然,那很好。而且由于线程不共享内存的任何部分,因此您也不需要任何同步。

于 2013-06-11T13:15:51.713 回答