加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 来自std :: promise的未知异常

发布时间:2020-12-16 04:58:28 所属栏目:百科 来源:网络整理
导读:以下代码有什么问题?运行时,程序以未知异常中止 #include iostream#include futureint main() { auto promise = std::promiseint{}; auto future_one = promise.get_future(); promise.set_value(1); return 0;} 错误输出是 terminate called after throwin
以下代码有什么问题?运行时,程序以未知异常中止
#include <iostream>
#include <future>

int main() {
    auto promise = std::promise<int>{};
    auto future_one = promise.get_future();
    promise.set_value(1);

    return 0;
}

错误输出是

terminate called after throwing an instance of 'std::system_error'
  what():  Unknown error -1
Aborted (core dumped)

g – 版本给我

g++ (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation,Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

相同的代码在mac上运行得很好

注意异常源自的代码行是promise.set_value(1)

解决方法

简而言之,添加-pthread可以解决您的问题.
$g++ -std=c++14 -g -pthread -o temp temp.cpp
$./temp

细节

我可以在编译时使用以下命令重现Ubuntu 16.04上的行为:

$g++ -std=c++14 -g -o temp temp.cpp
$./temp
terminate called after throwing an instance of 'std::system_error'
  what():  Unknown error -1
Aborted (core dumped)

GDB转储显示:

(gdb) bt
#0  0x00007ffff74ab428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1  0x00007ffff74ad02a in __GI_abort () at abort.c:89
#2  0x00007ffff7ae484d in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007ffff7ae26b6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff7ae2701 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007ffff7ae2919 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x00007ffff7b0b7fe in std::__throw_system_error(int) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7  0x000000000040259b in std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,std::__future_base::_Result_base::_Deleter> ()>*,bool*),std::__future_base::_State_baseV2*,std::function<std::unique_ptr<std::__future_base::_Result_base,bool*>(std::once_flag&,void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,std::__future_base::_State_baseV2*&&,std::__future_base::_Result_base::_Deleter> ()>*&&,bool*&&) (__once=...,__f=<unknown type in /home/mine/tempdir/temp,CU 0x0,DIE 0xe578>) at /usr/include/c++/5/mutex:746
#8  0x0000000000401e06 in std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base,std::__future_base::_Result_base::_Deleter> ()>,bool) (this=0x61ac30,__res=...,__ignore_failure=false) at /usr/include/c++/5/future:387
#9  0x0000000000402aee in std::promise<int>::set_value(int&&) (this=0x7fffffffe1c0,__r=<unknown type in /home/mine/tempdir/temp,DIE 0xeb8a>) at /usr/include/c++/5/future:1075
#10 0x0000000000401759 in main () at temp.cpp:7

从转储中,我们可以看到它正在使用互斥锁等.
然后我意识到std :: future的东西依赖于线程,所以它需要链接到pthread,否则我们会看到这个异常.

对于std :: thread也一样

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读