簡體   English   中英

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 是它所做的最后一件事。 這些是不相關的事件。

如評論中所述, std::futurestd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM