std :: promise <void>抛出未知错误,除非调用sleep

时间:2018-01-22 12:20:16

标签: c++ c++11 gcc

我有这段代码:

#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 个答案:

答案 0 :(得分:9)

此错误来自您的编译。它应该是:

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

<thread>库需要此特殊标记-pthread,但您提供了-lpthread。前者使用完整的线程支持编译您的翻译单元。后者只链接库,而不定义所需的宏和所需的工具。

关于coliru: