首页 > 解决方案 > std::future_error:无关联状态

问题描述

我对 C++ 11 未来/承诺有疑问。以下代码工作正常:

string s = "not written";

void write(promise<void>&& writePromise)
{
    cout << "\nwrite()" << endl;
    this_thread::sleep_for(chrono::seconds(1));
    s = "written";
    writePromise.set_value();
}

void read(future<void>&& readFut)
{
    cout << "read(), waiting..." << flush;
    readFut.wait();
    cout << "\ns: '" << s << "'" << endl;
}

int main()
{
    promise<void> writePromise;
    future<void> writeFuture = writePromise.get_future();

    thread tWrite(write, move(writePromise));
    thread tRead(read, move(writeFuture));
    
    tWrite.join();
    tRead.join();
}

但是一旦我将 main() 更改为:

int main()
{
    promise<void> writePromise;

    thread tWrite(write, move(writePromise));
    thread tRead(read, move(writePromise.get_future()));
    
    tWrite.join();
    tRead.join();
}

我收到错误消息:在抛出“std::future_error”
what() 的实例后调用终止:std::future_error: No associated state
Aborted (core dumped)

如果您在同一个 promise 上调用 get_future() 两次,则应该抛出此异常。

但是我所做的只是将 writePromise.get_future() 传递给一个函数,所以我不知道我是如何调用它两次的。

有人可以帮忙吗?

标签: c++multithreadingc++11promisefuture

解决方案


writePromise在从中产生未来之前就移动了。这是因为线程通过值获取了 Promise 的所有权。

修复它 - 首先获得未来,然后才转发承诺。


推荐阅读