2016-12-16 2 views
6
#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 link, std::future::wait блоки, пока результат не станет доклада доступен.
Почему не будущее :: Wait() блок

Однако, код, указанный выше, не может печатать что-либо. Очевидно, что основная нить закончилась до того, как закончилась нить pms.set_value.

Почему не ftr.wait() блок?

+0

Я хотел бы предложить вам взглянуть на станд :: асинхронной – LeDYoM

ответ

9

Проблема не в том, что std::future::wait не блокирует. Реальная проблема заключается в том, что у вас есть состояние гонки между нитью, которую вы породили, выполняете ее работу и уничтожением std::thread (временного) объекта в основном потоке.

Из-за этого в деструкторе std::thread вызывается abort, если поток все еще соединен.

Рабочий код:

#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

+3

Upvoted для не предполагая, отделяя нить. –

0

в качестве альтернативы вы можете отделить нить и использовать 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; 
} 
Смежные вопросы