前言
初次接觸「線程」概念時覺得深奧難懂,閱讀多本書、花費長時間才領悟真諦。本系列以初學者心態,完整展示線程相關基礎概念,語言精煉,部分需反覆閱讀。
什麼是線程
- 進程:資源分配單位(記憶體空間、檔案控制代碼、安全上下文)。
- 線程:CPU 排程執行單位,隸屬於進程。一個進程至少有一個線程(主線程)。
- 共享:同進程內線程共享進程資源(堆積、全域變數、檔案控制代碼)。
- 私有:每個線程擁有獨立的堆疊、暫存器狀態、執行緒區域儲存 (TLS)、程式計數器。
為什麼需要多線程
| 原因 | 說明 |
| 回應性 | UI 線程不被長時間運算阻塞 |
| 並行處理 | 多核心 CPU 同時執行多項任務 |
| 資源利用 | I/O 等待時切換執行其他工作 |
| 簡化模型 | 將複雜非同步邏輯拆分為獨立線程序列 |
多線程核心挑戰
- 同步:共享資料存取協調(鎖、訊號量、事件)。
- 死鎖:循環等待導致永久阻塞。
- 競爭條件:執行順序影響結果。
- 記憶體可見性:編譯器/CPU 最佳化導致跨線程讀取舊值。
- 上下文切換開銷:過多線程反而降低效能。
線程 vs 非同步
- 線程:併發執行單位,佔用系統資源(堆疊 ~1MB)、上下文切換成本高。
- 非同步:不阻塞呼叫線程的程式設計模式,
async/await、Task、I/O 完成埠 (IOCP) 實現,少量線程處理大量並發 I/O。
- 原則:I/O 密集用非同步,CPU 密集用多線程/Task.Run。
現代 .NET 多線程發展脈絡
Thread (1.0)
→ ThreadPool (1.0)
→ BackgroundWorker (2.0)
→ Task/TPL (4.0)
→ async/await (4.5)
→ ValueTask/Channels/Pipelines (Core 2.1+)
建議新專案優先使用 Task/async/await,直接操作 Thread 僅用於特殊需求(如專用線程、TLS、優先級控制)。
圖示說明
(原文包含兩張圖片,展示進程與線程關係、多線程記憶體模型)
- 上一篇文章: 多線程入門系列(二):Thread 類別完整操作指南
- 下一篇文章: 工作流程式設計漸進指南(五):狀態機工作流完整實作
Copyright ©
程式碼之家 All Rights Reserved