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不作为内存屏障,我们如何实现线程池,以便在未来完成时自动触发内存屏障?
如果您认为我对记忆障碍的理解是错误的,请纠正我.
[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同时执行,可能会导致数据的比赛.作为一般规则的例外,对于avector<bool> y,y[0] = true可以与之竞赛y[1] = true.- 尾注 ]
强调我的.比赛发生在a[i] = true;.vector<bool>不是真正的容器,访问"元素"需要触摸相邻元素的位操作.