C 中使用thread庫開多執行緒可以開無限多個嗎?

時間 2021-05-06 21:26:32

1樓:Seeman

不可以,在作業系統中有兩個資源會限制開子執行緒的個數。首先每個子執行緒有乙個file descriptor(windows裡面叫handle)作業系統分給每個程序的fd個數有上限的。其次每個子執行緒會占用stack,編譯時,每個程序stack的大小是有限制的,編譯選項可以設定stack的大小上限。

當達到上限,就不可以在建立子執行緒。

2樓:小島上的做題家

一般的做法是寫乙個threadpool,其實就是個queue,你往裡塞tasks,下面有固定數量的比如三個threads往外抽tasks去執行,類似乙個thread safe的pubsub。

開很多很多threads沒有意義,因為你cpu數量是有限的,況且機器不可能只有你乙個程序在用,開很多也是系統層面queued up而已。相比之下用少數threads和自己的乙個queue更加的高效。

究竟怎樣才是最好的,要先看你這個計算的性質,需要與外面共享多少資源。

3樓:Mathm

當然不是啊。

執行緒是CPU排程的基本單位,執行緒數目太多,CPU排程執行緒會有損耗。

如果是計算密集型的,建議執行緒數目是 std::thread::hardware_concurrency() ,

io密集型的,則使用2* std::thread::hardware_concurrency()

其他建議結合併發任務佇列,生產者消費者模型,構建執行緒池。

4樓:

執行緒太多的話, CPU 切換執行緒的開銷會大到不可忽略. 一般就和核心數開到差不多就行.

至於能不能開無限個, 那肯定不能. 每開乙個執行緒都需要分配一塊新的記憶體, 開了太多記憶體會耗盡的.

C 11是如何封裝Thread庫的?

template class Function,class.Args explicit thread Function f,Args args 如果不perfect forward,還是不難的嘛,用不著tuple或者虛函式 歐文韜 lambda表示式的原理 https www.owent.net T...

muduo庫在實際專案中使用的人多嗎?

ithewei muduo的類封裝還是值得一看的,就是底層實現上有點粗糙了,沒能跨平台,定時器直接使用的timerfd這種高階特性,推薦看看libhv,跨平台,定時器使用最小堆,介面超級簡單 https 丙玉 說實話muduo寫的確實很好,之前在大大小小的幾家遊戲呆過,公司平時開發啥的都是 Wind...

為什麼 C 中使用虛函式時會影響效率?

C 中使用虛函式不會影響效率。你遇到的場景,都沒到需要考慮流水線 friendly 的程度,先把東西寫出來,別想沒用的。 maple 因為查詢虛函式表的時候會有效率損失,可以通過模板的CRTP技術實現靜態繫結,詳見 C CRTP Curiously Recurring Template Patter...