【发布时间】:2021-05-14 09:29:08
【问题描述】:
错误: 在抛出 'std::future_error' 的实例后调用终止 what(): std::future_error: 无关联状态
g++ --version 7.5.0 但是,相同的代码行在具有相同 g++ 版本的 QNX 上运行良好。
另外,如果我们生成一个新线程并将 promise 作为参数移动到该线程函数,那么当在 promise 对象上调用 set_value() 时,异常不是属于自己的。
我的确切问题是,如果这是预期的行为, 有没有办法转移承诺对象的所有权,以便其他线程可以在稍后执行期间使用它。 除了产生一个新线程,而是能够从一个已经存在的线程访问 Promise。
#include <future>
using namespace std;
int main()
{
promise<int> p1;
promise<int> p2(move(p1));
p1.set_value(99); // SIGSEGV!
}
【问题讨论】:
-
等一下...您已将
p1移动到p2,然后将状态设置为p1?那应该怎么做? -
这里没有崩溃。抛出了一个异常。
std::terminate被调用。显示了描述问题的消息。 您的问题究竟是什么?你问它为什么会抛出?为什么调用终止?如何在不投掷的情况下完成您的预期任务? -
我相信
throw/terminate是正确的行为。你从来没有为承诺创造过未来,那么set_value到底应该做什么? -
@Guruprasad 你得到的答案没有回答你的问题吗?