是std :: future ::等待内存障碍吗?(我不能解释这个数据竞赛)

Hel*_*ang 4 c++ multithreading c++11

这是代码:

std::vector<bool> a(req_count_);
std::vector<std::future<void>> waits(req_count_);

for (int i = 0; i < req_count_; i++) {
  // send into a threadpool implementation
  waits[i] = framework::Async([i, &a] {
    a[i] = true; // write true
  });
}

for (int i = 0; i < req_count_; i++) {
  waits[i].wait(); // memory barrier?
}

int last_req_count = req_count_;
req_count_ = 0;

for (int i = 0; i < last_req_count; i++) {
  if (!a[i]) { // read false
    return false;
  }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是否会std::future::wait起到记忆障碍的作用?std::future::wait等待函数调用完成,但函数是否在之前发生 std::future::wait(例如,函数调用引起的状态变化是否可以从其他线程看到)?

如果std::future::wait不作为内存屏障,我们如何实现线程池,以便在未来完成时自动触发内存屏障?

如果您认为我对记忆障碍的理解是错误的,请纠正我.

Igo*_*nik 9

[container.requirements.dataraces]/2尽管[res.on.data.races] ,需要实现,以避免数据的比赛时,在相同的容器中的不同元素,所包含的对象的内容以外vector<bool>,被同时修改.

[container.requirements.dataraces]/3 [ 注:对于一个vector<int> x具有尺寸大于一,x[1] = 5并且*x.begin() = 10可以不经数据争同时执行,但x[0] = 5*x.begin() = 10同时执行,可能会导致数据的比赛.作为一般规则的例外,对于a vector<bool> y,y[0] = true可以与之竞赛y[1] = true.- 尾注 ]

强调我的.比赛发生在a[i] = true;.vector<bool>不是真正的容器,访问"元素"需要触摸相邻元素的位操作.