std :: future_error:无关联状态

发布时间:2020-07-06 19:21

我对C ++ 11 future / promise有问题。 以下代码可以正常工作:

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:无关联状态
中止(核心已弃用)

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

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

有人可以帮忙吗?

回答1

您移动了writePromise,然后才从中产生未来。这是因为线程按价值获得对承诺的所有权。

要解决此问题-首先获得未来,然后再转发承诺。