pEnd_是一个对象成员,并且只能在一个线程中以如下方式增加add(),它可能会被另一个线程读取。我们需要在add()中使用__sync_synchronize吗?

struct Vector {
    ...
    void add(int v) {
        *pEnd_ = v;
        __sync_synchronize(); // is this needed?
        ++pEnd_;
    }
private:
    int* pBegin_;
    int* pEnd_;
}

在另一个线程中进行迭代。
for (p = pBegin_; p != pEnd_; ++p) {
  // read barrier here may be inserted
  if (*p) {
    ....
  }
}

最佳答案

如果没有释放内存障碍,则您对*pEnd所做的修改不一定对其他线程可见。因此,需要一些东西。

严格来说,不需要__sync_synchronize(),因为它是一个完整的内存屏障。如果您的编译器没有用于仅释放屏障(也称为“写屏障”)的内在函数,则完全屏障是合理的。

从表面上看,这是由于您的pEnd增量相对于其他线程的读取未排序而引起的数据争用。特定的平台可能会保证int*访问是原子的,并且还可能会保证更改在其他线程中以在该线程中写入的相同顺序变得可见。因此,在某些平台上,代码可以(并且完整的屏障可防止对写进行重新排序)。这些都不是标准的C++,它很可能特定于硬件而不是编译器。

关于c++ - “*pEnd_ = v; __sync_synchronize ();++pEnd_;”是否需要内存屏障?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20885332/

10-09 00:03