簡體   English   中英

為每個處理器生成多個線程是否有意義?

[英]Does it make sense to spawn more than one thread per processor?

從邏輯的角度來看,一個應用程序可能需要數十個或數百個線程,其中一些線程將在大多數時間內休眠,但很少有線程將始終同時運行。 問題是:產生比系統中的處理器更多的並發線程是否有意義,還是浪費?

我已經看到一些服務器應用程序實現了一個調度程序來邏輯地管理任務(通常稱為作業),但也產生了很多線程,所以我沒有看到它的好處。

提前致謝。

當然。 如果您的軟件頻繁使用磁盤或網絡IO,則通常可以通過添加更多線程來提高吞吐量。 當其他線程在IO上阻塞時,那些額外的線程將會喚醒並執行操作。

其他人已經談到了幾乎肯定有意義的情況(當你做任何緩慢的IO時)。

如果出現以下情況可能不是一個好主意:

  • 你的線程正在進行CPU綁定工作

  • 每個線程都想要使用不重疊的內存(即與高速緩存大小相比顯着)

在這種情況下,可能會導致不必要的緩存未命中。

這可能是有道理的

  1. 您的程序設計的好處,因為您擁有最好在線程中實現的並行任務,或者

  2. 您的一些線程受I / O限制,因此它們不會自行使用處理器/內核。

簡短的回答是“是”。

即使你認為你可以通過多處理器環境中的多線程獲得更多,它仍然是單處理器機器上的一項有用技術,主要是因為它意味着你將一些工作委托給流程調度程序,誰應該擁有比你更好的信息。

如果你沒有多線程,你最終會自己完成調度工作,如果這是你需要的,這可能是一件好事,但很可能既乏味又低效

每當你有一個等待I / O操作的任務時,將它包含在一個線程中並將其激活是有意義的。 在等待I / O操作完成時,您的線程很可能會被掛起。 當它被喚醒時,結果將等待它。

其中一個好處是當您升級硬件時,可能會獲得更多處理器/核心。

因為所有現代操作系統都是多任務處理:每個線程從處理器獲得時間共享。 它實際上不是並發執行,但考慮到處理器每秒可處理數千個請求,它是一個“明顯的”並發執行。

所以,是的,如果需要,在單個處理器上使用多線程確實有意義。

根據Herb Sutter(並發領域的領先專家之一)的說法,並發的支柱之一通過異步代理進行響應和隔離 摘要是:

通過獨立運行任務和異步任務,通過消息進行通信來保持響應。

偉大的文章(和整個系列!)。 我還在等這本書。

我發現在編寫通過網絡處理大量數據集的數據解析器時,最好為字母表中的每個字母創建一個線程(與數據有關),並使程序更多地受CPU和內存限制。 I / O有限性繼承了網絡和磁盤操作是一個主要的瓶頸,所以你也可以“開始”其他數據文件而不是順序完成工作。

在四核上,啟動超過四個線程肯定是有意義的。 這四個線程不太可能分布在多個核心上,尤其是當今的處理器速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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