Dev*_*Dev 4 c++ multithreading
我对Scott Meyers撰写的有效现代C ++的第270页有疑问。
他在第5/6行中写道:“唯一的妙处是,每个响应线程都需要引用共享状态的std :: shared_future的ITS OWN COPY ...”
我的问题是:为什么我们必须将的副本传递给std::shared_future每个线程中的每个lambda函数?鉴于先验,我认为通过引用传递它没有任何问题,以至于存在不同线程使用的唯一共享状态?
即使我通过了SF标准参考书,我也写了一个代码,改编自Scott Meyers博士的书,该代码有效。
因此,是否可以通过引用传递它?
#include <future>
#include <vector>
std::promise<void> p;
void react(){}
void detect()
{
auto sf = p.get_future().share();
std::vector<std::thread> vt;
int n=10;
for(int i=0;i < n; i++)
{
vt.emplace_back([sf]{sf.wait();
react();
});
}
p.set_value();
for(auto& t : vt)
t.join();
}
int main()
{
detect();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果通过引用传递,则多个线程正在访问的相同实例shared_future。这可能导致数据争用,并且是未定义的行为。如果多个线程通过自己的副本访问共享状态shared_future,则库将确保它们已同步。
该cppreference页面上get说:
它有效地调用
wait()以便等待结果。
并在cppreference页面上wait说:
std::shared_future从多个线程在同一线程上调用wait 是不安全的;预期用途是供等待相同共享状态的每个线程使用的副本std::shared_future。