我有这个代码:
#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
有什么奇怪的,添加零秒睡眠before创建承诺,防止异常:
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
$
I tried gcc
4.8.5和5.4.0,结果相同。为什么它会这样?
这个错误来自于你的编译。它应该是:
g++ -o foo foo.cpp -std=c++11 -pthread
The <thread>
图书馆需要这个特殊的标志-pthread
但你提供了-lpthread
。前者编译具有完整线程支持的翻译单元。后者只链接库,没有定义所需的宏和所需的工具。
关于科利鲁:
- with
-pthread
: http://coliru.stacked-crooked.com/a/a53bed6696bb8d83 http://coliru.stacked-crooked.com/a/a53bed6696bb8d83
- 没有:http://coliru.stacked-crooked.com/a/fd972e1556f8c060 http://coliru.stacked-crooked.com/a/fd972e1556f8c060
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)