std::future::get()或std::future::wait()是std::thread::join()的替
Is std::future::get() or std::future::wait() a replacement for std::thread::join()?
调用未来的future.get()
/future.wait()
后,线程会像thread.join()
一样重新加入吗?我可以只使用线程的未来而不直接访问该线程吗?
std::future::get()
或std::future::wait()
是std::thread::join()
的替代品吗
不,这些是不同的东西。
std::future
是一个同步工具。它是一个值的包装器,该值不是立即可用的,但会立即可用。它用于从异步操作(可以在另一个线程中运行(传递数据。在引擎盖下,它包含一个信号量,如果需要,get()
会在上面等待。
另一方面,std::thread
表示实际的执行线程。它可以产生多个结果,从而在其寿命期间提供多个std::promise
。它应该这样做,因为启动和连接线程是一项相对繁重的操作,比等待未来要繁重得多。这就是为什么人们应该更喜欢重用线程,将异步操作发布到线程池并等待它们的结果(std::packaged_task
是一个有用的抽象(。
线程不会在std::future::get()
之后立即退出,即使设置promise是它所做的最后一件事。这些都是不相关的事件。
使用future
时,您不能100%确定是否创建了实际的新线程。例如,当您使用std::launch::deferred
执行策略创建future
时,执行非常串行。
引用标准:
std::launch::deferred
:任务在调用线程首次请求其结果(延迟评估(
在实践中,当您使用std::launch::async
执行策略创建future
时,大多数时间都会启动新线程。用gcc 10
检查生成的代码,我可以清楚地看到thread::join
被称为:
std::__future_base::_Async_state_commonV2::_M_complete_async():
pushq %rbp
movq %rsp, %rbp
//more assembly maddness
call std::__future_base::_Async_state_commonV2::_M_join()
这又导致CCD_ 21调用。
std::__future_base::_Async_state_commonV2::_M_join():
pushq %rbp
movq %rsp, %rbp
subq $48, %rsp
movq %rdi, -40(%rbp)
movq -40(%rbp), %rcx
addq $32, %rcx
movq %rcx, -24(%rbp)
movl $std::thread::join(), %eax
...
如注释所述,std::future
与std::thread
没有任何关系。因此,仅当使用std::thread
时才使用std::thread::join
,如果使用std::future
则使用std::future::get
/std::future::wait
。
在std::future
引擎盖下,有一个线程池,它接受作业并以智能的方式分发它。
- 架构决策:返回std::future还是提供回调
- std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?
- 修改在 std::future 的 lambda 中引用捕获的值
- C++ std::future没有被调用
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- Make zmqpp::socket::connect a std::future
- std::future可以比std::promise活得更长吗
- std::future::get()或std::future::wait()是std::thread::join()的替
- 当 std::future 准备好被检索时发出信号主线程
- 当多次调用时,"std::future::then"的行为是什么?
- 使用 std::future 的不完整类型无效使用
- 为什么 std::future::wait_for 的行为不符合预期?
- 是什么给了 std::future 一些共享状态
- STD :: Future no_state异常与断言
- 标准是否保证在移动std::p ackaged_task后安全使用std::future?
- 将 Boost 链与 std::future 结合使用
- 删除 std::future 和 std::p romise 的空白专用化
- std::future给了我错误3,我做错了什么
- 如何在 std::future 的向量中调用异步函数
- 在 std::future::unwrap() 和 std::future::get() 中竞争