gpt4 book ai didi

c++ - 这里需要内存屏障 "*pEnd_ = v; __sync_synchronize ();++pEnd_;"吗?

转载 作者:行者123 更新时间:2023-11-30 02:49:50 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com