首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

並行思維(三):線程本質、調度機制與線程安全核心原理

     編輯:關於.NET

線程是什麼?

現代作業系統採用 **搶占式多任務調度**。單核 CPU 透過極短時間片 (Windows ~20ms) 快速切換執行緒,欺騙人眼產生「同時運行」假象 (人眼感知閾值 ~100ms)。

進程 vs 線程:資源擁有 vs 執行單元

進程 = 資源容器

  • 虛擬地址空間 (隔離)
  • 代碼段 (含 DLL)
  • 資料段 (全域變數)
  • 環境字串、進程堆、開啟句柄...
  • **至少一個線程**

線程 = CPU 調度基本單位

  • 共享進程所有資源 (代碼、全域變數、環境、堆、句柄)
  • 獨有資源:
    • **堆疊** (呼叫鏈、區域變數、返回位址)
    • **TLS (Thread Local Storage)** — 指標陣列,線程專屬資料槽
    • **堆疊參數** (建立時指定大小等)
    • **Context 結構** — 核心維護的暫存器快照 (RIP, RSP, RFLAGS...)
Windows 進程示意圖
圖 1:多線程進程記憶體佈局示意

.NET 執行緒特殊性:CLR Thread ≠ OS Thread

  • CLR 保留**不 1:1 映射 OS 執行緒**的權利
  • 寄宿場景 (SQL CLR, ASP.NET Core) 可能將 CLR Thread 映射為 **Fiber (纖程)** — 輕量級用戶態執行緒,OS 無感知
  • 這意味著:Thread.CurrentThread.ManagedThreadId 不等於 OS Thread ID

多進程 vs 多線程:粒度權衡

維度多進程多線程
隔離性極強 (記憶體完全隔離)弱 (共享記憶體)
通訊成本高 (IPC、Socket、共享記憶體)低 (直接訪問共享變數)
上下文切換慢 (換頁表、TLB 刷新)快 (共用地址空間)
穩健性單進程崩潰不波及其他單線程崩潰可能拖垮進程
適用場景粗粒度、低同步、高隔離細粒度、高頻同步、共享狀態

線程程式設計核心難題

  1. **任務分解與分配**:如何切分工作讓所有核心飽和?
  2. **執行緒池 vs 逐個建立**:池化避免建立/銷毀開銷,控制併發度
  3. **最佳執行緒數**:CPU 密集型 ≈ 邏輯核心數;I/O 密集型 > 核心數
  4. **任務完成後**:歸還池、續行工作、異步組合

Microsoft .NET 平行擴充庫 (TPL, PLINQ, Async/Await) 旨在**抽象化線程管理**,讓開發者專注「並行邏輯」而非「線程機制」。但理解底層細節仍是寫出高效代碼、排查效能問題的前提。

線程安全:核心定義與保障機制

定義

代碼在**並行/併發執行**時行為正確 (符合規格),即為線程安全。單執行緒無此問題 (單一控制流)。

核心威脅:共享可變狀態

  • 任何**寫入共享變數**的操作都需保護
  • 讀取通常安全,**讀寫衝突、寫寫衝突** 是禍根

保障手段

  1. 互斥鎖:lock / Monitor / Mutex / SemaphoreSlim — 同一時間只允許一執行緒進入臨界區
  2. 無鎖編程:Interlocked / ConcurrentDictionary / Immutable Collections — 硬體原子操作 / 無鎖資料結構
  3. 線程封閉:ThreadLocal<T> / [ThreadStatic] — 狀態不共享,自然安全
  4. 不可變物件:`readonly`、Record Types、函數式風格 — 無寫入、天然安全
  5. 線程安全集合:System.Collections.Concurrent.* — **注意:標準泛型集合 `List`、`Dictionary` 皆非線程安全**

庫函數檢查清單

  • 呼叫第三方庫函數前,**必須查閱文檔確認線程安全性**
  • 無安全版本時,自行加鎖封裝或尋找替代品

下一篇預告

深入剖析 **鎖的實現原理 (Monitor、SpinLock、ReaderWriterLockSlim)**、無鎖資料結構設計、**記憶體模型與 volatile/Interlocked**、死鎖/活鎖/飢餓診斷與預防**、非同步程式模式 (APM/EAP/TAP) 與執行緒池交互。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved