我有这段代码:
#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,结果相同。为什么它会像那样?
答案 0 :(得分:9)
此错误来自您的编译。它应该是:
g++ -o foo foo.cpp -std=c++11 -pthread
<thread>
库需要此特殊标记-pthread
,但您提供了-lpthread
。前者使用完整的线程支持编译您的翻译单元。后者只链接库,而不定义所需的宏和所需的工具。
关于coliru: