And*_*iov 8 c++ multithreading future promise c++11
我对 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();
}
Run Code Online (Sandbox Code Playgroud)
但是一旦我将 main() 更改为:
int main()
{
promise<void> writePromise;
thread tWrite(write, move(writePromise));
thread tRead(read, move(writePromise.get_future()));
tWrite.join();
tRead.join();
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:抛出 'std::future_error' 实例后终止调用
What(): std::future_error: 无关联状态
中止(核心转储)
如果您对同一个 Promise 调用 get_future() 两次,则应该抛出此异常。
但我所做的只是将 writePromise.get_future() 传递给一个函数,所以我不知道如何调用它两次。
有人可以帮忙吗?
你writePromise在从中创造未来之前就已经搬家了。这是因为线程通过值获取了 Promise 的所有权。
要解决这个问题——首先获得 future,然后才转发 Promise。