在 std::promise::set_value 崩溃中崩溃

问题描述

错误: 抛出“std::future_error”实例后调用终止 what(): std::future_error: 无关联状态

g++ --version 7.5.0 但是,相同的代码行在具有相同 g++ 版本的 QNX 上运行良好。

此外,如果我们生成一个新线程并将 promise 作为参数移动到该线程函数,那么在对 promise 对象调用 set_value() 时异常不是自己的。

我的确切问题是,如果这是预期的行为, 有没有办法转移 promise 对象的所有权,以便其他线程可以在稍后执行期间使用它。 除了生成一个新线程之外,还可以从一个已经存在的线程访问 promise。

#include <future>

using namespace std;

int main()
{
    promise<int> p1;
    promise<int> p2(move(p1));
    p1.set_value(99); // SIGSEGV!
}

解决方法

获得异常是这里的标准行为。当您移动承诺时,它将承诺持有的共享状态移动到移动对象。这使得移动的对象没有共享状态。如果我们查看 reference page of set_value(),我们会看到它状态

例外
std::future_error 在以下条件下:

  • *this 没有共享状态。错误类别设置为 no_state

如果您的 QNX 实现没有抛出异常,那么它就是不符合标准的。