[英]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 是它所做的最后一件事。 這些是不相關的事件。
如評論中所述, std::future
與std::thread
沒有任何關系。 因此,只有在使用std::thread
時才使用std::thread::join
,如果使用std::future
::future 則使用std::future::get
/ std::future::wait
。
在std::future
引擎蓋下,有一個線程池接受作業並以智能方式分發它。
使用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()
這又會導致thread::join()
調用。
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
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.