在多个线程中使用相同的内存块是否安全,如下所示:
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]之间读取。
我认为没关系。我是对的吗?
答案 0 :(得分:6)
两个线程在正确性方面访问不同的内存区域没有问题。
可能会影响您的问题是false sharing导致的性能问题。您可以通过确保两个内存区域之间至少有一个未使用空间的整个缓存行来避免这些。
如果您想了解有关虚假分享的更多信息,请参阅Herb Sutter关于此主题的文章之一:Eliminate False Sharing。
答案 1 :(得分:2)
看起来你已经安排好每个线程使用自己的内存块部分而不触及属于另一个线程的部分。当然,那没关系。并且由于线程不共享内存的任何部分,因此您也不需要任何同步。