作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
pEnd_是一个对象成员,只能在一个线程中如下增加add(),它可能被另一个线程读取。我们需要在 add() 中使用 __sync_synchronize 吗? struct Vector {
我是一名优秀的程序员,十分优秀!