为什么没有future :: wait()块

时间:2016-12-16 14:34:33

标签: c++ multithreading c++11 promise future

#include <iostream>
#include <string>
#include <thread>
#include <future>


int main()
{
    auto pms = std::promise<std::string>();
    auto ftr = pms.get_future();

    std::thread([&](){pms.set_value("hello world");});    
    ftr.wait();
    std::cout << ftr.get() << std::endl;

    return 0;
}

根据this linkstd::future::wait会阻止,直到结果变得可用。

但是,上面的代码无法打印任何内容。显然主线程已经在pms.set_value的线程完成之前完成。

为什么ftr.wait()没有阻止?

2 个答案:

答案 0 :(得分:9)

问题不在于std::future::wait没有阻止。真正的问题是你在产生的线程,做它的工作以及主线程中std::thread(临时)对象的破坏之间存在竞争条件。

因此,如果线程仍然可以连接,则在abort的析构函数中调用std::thread

工作代码:

#include <iostream>
#include <string>
#include <thread>
#include <future>
#include <chrono>

int main()
{
    auto pms = std::promise<std::string>();
    auto ftr = pms.get_future();

    std::thread thread ([&](){pms.set_value("hello world");});    
    ftr.wait();
    std::cout << ftr.get() << std::endl;
    thread.join ();
    return 0;
}

注意,如果您未明确加入thread,您仍然会遇到相同的竞争条件(因为main可以更快地完成其工作, thread可以自我清理。

演示工作示例:here

答案 1 :(得分:1)

或者,您可以分离线程并使用promise::set_value_at_thread_exit而不是set_value

#include <iostream>
#include <string>
#include <thread>
#include <future>
#include <chrono>


int main()
{
    auto pms = std::promise<std::string>();
    auto ftr = pms.get_future();

    std::thread([&](){pms.set_value_at_thread_exit("hello world");}).detach();    
    ftr.wait();
    std::cout << ftr.get() << std::endl;

    return 0;
}