已通过std::async赋值并使用的std::future能否重新赋值?
已使用过的std::future能否重新赋值给新的std::async返回值?
你的代码是完全合法的,不会导致未定义行为,这种用法符合C++标准对std::future的规定。
核心原因
std::future的赋值运算符(operator=)支持将新的std::future实例(比如std::async的返回值)赋值给一个已经被使用过的std::future对象,无论原对象处于就绪、未就绪还是无效状态:
- 赋值时,原
std::future会先释放自身关联的所有资源:如果原对象还关联着未完成的异步任务,会等待任务完成后清理;如果已经完成任务或处于无效状态(比如调用过get()后),则直接清理资源。 - 随后,原对象会接管新
std::future的状态,关联新的异步任务。
针对你代码的具体分析
- 初始化
f1为关联fib(40)异步任务的std::future。 - 调用
f1.wait()等待任务完成,此时f1进入就绪状态。 - 调用
f1.get()获取计算结果,此时f1内部存储的结果会被移动,f1变为无效状态(不再关联任何任务或结果)。 - 将
std::async(std::launch::async, []{ return fib(43); })的返回值赋值给f1,f1重新关联新的异步任务,状态变为未就绪。 - 再次调用
f1.get(),等待新任务完成并获取结果,整个流程完全合规。
需要注意的是:std::future的get()成员函数只能调用一次(调用后结果被移动,对象变为无效),但你的代码中两次get()分别对应两个独立的异步任务,因此不存在冲突。
内容的提问来源于stack exchange,提问作者EmbeddedDOOD
相关产品推荐
相关产品推荐

