【问题标题】:std::promise<void> throws Unknown error, unless calling sleepstd::promise<void> 抛出未知错误,除非调用 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,结果相同。为什么会这样?

【问题讨论】:

标签: c++ c++11 gcc


【解决方案1】:

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

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

&lt;thread&gt; 库需要这个特殊标志 -pthread,但您提供了 -lpthread。前者使用完整的线程支持编译您的翻译单元。后者只链接库,没有定义需要的宏和工具。

关于大肠杆菌:

【讨论】:

  • @infinitezero 这可能是由于我的第一个版本不完美(但是否值得一票否决,谁知道?)。
猜你喜欢
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2015-06-29
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多