c++ - 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() 传递给一个函数,所以我不知道我是如何调用它两次的。
有人可以帮忙吗?
解决方案
你writePromise
在从中产生未来之前就移动了。这是因为线程通过值获取了 Promise 的所有权。
修复它 - 首先获得未来,然后才转发承诺。
推荐阅读
- c# - 在 linq 表达式中创建新对象时获取列表中的当前索引位置
- export-to-csv - 从 MicroStrategy 中的某个组/项目中检索所有访问权限
- c# - 为什么在 EF Core 中使用 Include(或 ThenInclude)时不需要指定类型?
- html - 如何管理 css 媒体查询网格列
- java - 除以 0 但代码中没有零的错误
- docker - Docker-compose 卷无法按预期工作
- auth0 - auth0 获取后台配置文件信息
- python - 从 Olx 广告中抓取电话号码
- jquery - Jquery如何从开始将数据键推送到数组中
- angular - Angular 8 - 按顺序调用可观察对象