系列緣起與多線程無處不在
身為 ASP.NET 開發者,平日較少主動寫多線程,但隨 .NET 4.0 即將釋出,並行計算將成主流,故以部落格系列總結 .NET 3.5 多線程並引入 4.0 新平行庫與思維。
其實我們時刻享受多線程紅利:
- Web 伺服器本身即多線程環境,每請求一線程,單線程無法應對高併發。
- 資料庫亦為多線程處理查詢。
- WinForm 常開新線程處理耗時操作避免 UI 凍結。
但傳統「事事開新線程」思維停留在單核時代,多核時代應讓任務真正並行而非「看起來並行」。
進程、線程與時間片輪轉
- 進程至少含一線程;多線程讓程式「同時」做多事。
- 單核時代:CPU 以極短時間片輪轉執行多線程,宏觀上似並行。
- 比喻:雙手畫畫的畫家、一邊打電話一邊聊天(腦力切換上下文有成本)。
多核下的並行優勢與限制
- 單核下多線程不一定比單線程快(切換開銷),但 I/O 等待時可讓出 CPU 提升吞吐。
- 多核可真正並行指令,但單一任務若指令間強相依難以拆分並行;多個獨立任務則能充分利用多核。
線程非越多越好
- 預設每線程 1 MB 堆疊,32 位進程 2 GB 空間理論上限 ~2000 線程,實測 ~1930 即 OOM。
- Outlook 2007 僅用 50 線程左右,足見一般應用無需大量線程。
多線程編程的三大挑戰
- 複雜度:任務分割、資源鎖定、死鎖風險。
- 除錯困難:線程間依賴、非確定性執行順序。
- 效能不可預測:硬體環境、OS 排程、.NET 執行階段皆影響表現;針對特定環境優化可能在其他環境失效。
本系列預計 30 篇,淺顯介紹 .NET 多線程編程與常見應用模式,冀對諸君有益。