反应线程需要引用共享状态的std :: shared_future的OWN COPY

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)

L. *_* F. 5

如果通过引用传递,则多个线程正在访问的相同实例shared_future。这可能导致数据争用,并且是未定义的行为。如果多个线程通过自己的副本访问共享状态shared_future,则库将确保它们已同步。

cppreference页面get说:

它有效地调用wait()以便等待结果。

并在cppreference页面wait说:

std::shared_future从多个线程在同一线程上调用wait 是不安全的;预期用途是供等待相同共享状态的每个线程使用的副本std::shared_future