c++ - std::future_error:无关联状态

标签 c++ multithreading c++11 promise future

我对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()传递给一个函数,所以我看不到如何两次调用它。
有人可以帮忙吗?

最佳答案

您先移动了writePromise,然后再从中生成将来的代码。这是因为线程通过值(value)获得对 promise 的所有权。
要解决它-首先获得 future ,然后再兑现 promise 。

关于c++ - std::future_error:无关联状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62763035/

相关文章:

c++ - 无法使用 lambda 函数创建 unordered_set

c++ - 如何从/向二进制文件读取/写入 std::string 值

c++ - 通过指针访问 std::vector 元素与 end()

c++ - 除非旋转为 0 度或 180 度,否则物体不会朝它所面对的方向移动

g++ - C++ 中的 Mixins、可变参数模板和 CRTP

c - VS2015 中 C 代码中的无作用域枚举

c++ - 没有互斥锁的事件通知

java - Thread.sleep 不工作 Android

java - 我应该创建一个新线程作为扩展 Thread 的类,还是只进行一个新的 Thread 对象实例化?

c# - Thread.Join() 更改 C# 中的程序输出