std:: promise выдает неизвестную ошибку, если вызов сна

у меня есть этот код:

#include <future>
#include <thread>

int main()
{
    std::promise<void> p;
    p.set_value();
    p.get_future().get();

    return 0;
}

и после компиляции он с gcc он бросает std::system_error:

$ g++ -o foo foo.cpp -std=c++11 -lpthread
$ ./foo
terminate called after throwing an instance of 'std::system_error'
  what():  Unknown error -1

что странно, добавление нулевой секунды сна до создание обещания, предотвращает исключение:

int main()
{
    std::this_thread::sleep_for(std::chrono::milliseconds(0));
    std::promise<void> p;
    p.set_value();
    p.get_future().get();

    return 0;
}

$ g++ -o foo foo.cpp -std=c++11 -lpthread
$ ./foo
$ 

пробовал gcc 4.8.5 и 5.4.0, те же результаты. Почему он так себя ведет?

1 ответов


эта ошибка происходит из вашей компиляции. Должно быть:

 g++ -o foo foo.cpp -std=c++11 -pthread

на <thread> библиотека нужен этот специальный флаг -pthread но вы предоставили -lpthread. Первый компилирует ваш блок перевода с полной поддержкой потока. Более поздняя только связывает библиотеку, не определяя необходимые макросы и необходимые инструменты.

на coliru: