c++ 11 thread example




C++ 11:std:: thread匯集了嗎? (3)

std::thread應該在抽象成本方面非常便宜,它是低級別的東西。 據我了解,標準庫實現可能只是盡可能地封裝底層的OS機制,因此您可以假設線程創建的開銷相似或相當。

我不知道任何具體的實現,但這是我從閱讀C ++ Concurrency In Action的第二手理解,標準建議他們使用最有效的方法實用。 作者肯定認為與DIY相比,成本會或多或少地微不足道。

這個庫在概念上與Boost類似,所以我想用Boost實現來得出一些結論不會太牽強。

基本上,我認為沒有直接回答你的問題,因為它沒有明確說明。 雖然聽起來我們會更有可能看到非常薄的包裝器實現,但我不認為庫編寫器如果提供效率優勢就不會使用線程池。

在C ++ 03中,我使用pthread和自建的線程池,它總是保持一些線程運行(因為pthread_create很慢),這樣我就可以在不考慮性能問題的情況下為小任務啟動線程。

現在,在C ++ 11中我們有std::thread 。 我想標準沒有說明具體的實現,所以我的問題是標準的庫實現。 他們通常選擇合併方法,其中構造std::thread是便宜的(例如,不會在posix上調用pthread_create ),還是std::thread只是一個包裝器?

換句話說,是否仍然在C ++ 11中推荐一個線程池,或者我應該只在需要時創建一個std::thread並將性能提升到標準庫?


std::thread是一個執行線程。 期。 它來自哪裡,如何到達那裡,是否存在一些“實際”線程等等,都與標準無關。 只要它像一個線程,它就可以是一個std::thread

現在,很可能std::thread是一個真實的OS線程,而不是從線程池或其他東西中提取的東西。 但是理論上C ++ 11確實允許將std::thread實現為從池中提取的東西。


首先,正如您所提到的,C ++標準基本上沒有指定庫實現。 但是C ++標準庫的實現者遵守“as-if”規則。

例如,這意味著std::thread構造函數應該表現得就好像新線程創建了底層API的瘦包裝還是高效的實現(如線程池)。 (這裡,'thread'表示C ++ 11規範中的抽象執行線程 ,而不是具體的OS本機線程)

關於線程池實現;

  • C ++編譯器和庫應該正確處理C ++線程特定的資源(即thread_local變量),它們應該在運行時協同工作。
  • 即使滿足上述條件,似乎也不可能與OS特定的線程資源(Windows的TLS,pthread的TSS等)協同工作。

所以,我假設大多數std::thread實現只是底層線程API的包裝。







stdthread