std::promise<void> 抛出未知错误,除非调用 sleep
Posted
技术标签:
【中文标题】std::promise<void> 抛出未知错误,除非调用 sleep【英文标题】:std::promise<void> throws Unknown error, unless calling sleep 【发布时间】:2018-01-22 12:20:15 【问题描述】:我有这个代码:
#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,结果相同。为什么会这样?
【问题讨论】:
我无法重现它:wandbox.org/permlink/FDfl2jIkEeAXIbKj 您是否有任何理由认为需要省略可以重现此内容的 GCC 版本?重要信息的种类... Unknown exception from std::promise的可能重复 使用-lpthread
构建是错误的。您应该使用-pthread
。
@ks1322 谢谢,看来是关于lpthread
vs pthread
【参考方案1】:
此错误来自您的编译。应该是:
g++ -o foo foo.cpp -std=c++11 -pthread
<thread>
库需要这个特殊标志 -pthread
,但您提供了 -lpthread
。前者使用完整的线程支持编译您的翻译单元。后者只链接库,没有定义需要的宏和工具。
关于大肠杆菌:
与-pthread
:http://coliru.stacked-crooked.com/a/a53bed6696bb8d83
没有:http://coliru.stacked-crooked.com/a/fd972e1556f8c060
【讨论】:
@infinitezero 这可能是由于我的第一个版本不完美(但是否值得一票否决,谁知道?)。以上是关于std::promise<void> 抛出未知错误,除非调用 sleep的主要内容,如果未能解决你的问题,请参考以下文章
创建 std::promise<std::tuple<T>> 时出现错误 C2512(仅限 Visual Studio)
std::future, std::async, std::promise
std::future, std::async, std::promise
std::future, std::async, std::promise