iT邦幫忙

2026 iThome 鐵人賽

DAY 21
0
自我挑戰組

學習C#續系列 第 21 篇

Day 21: 多執行緒基礎與執行緒安全(Thread & Concurrency)

  • 分享至 

  • xImage
  •  

執行緒(Thread)基礎:

  • 程式執行的最小獨立單元。透過建立多個執行緒,可以讓多項任務在背景同時(並行/並行)執行,避免耗時任務阻塞主執行緒(如終端機畫面凍結)。
  • 命名空間為 System.Threading。
    Thread vs ThreadPool(執行緒池):
  • 手動 Thread:
    • 每次 new Thread() 都會向作業系統索取原生執行緒,建立與銷毀的開銷極大(預設每個執行緒配置約 1 MB 堆疊記憶體)。
    • 適合執行時間很長(如背景常駐監控服務)或需要自訂執行緒優先權、設定前台/背景屬性的情境。
  • ThreadPool(執行緒池):
    • 預先建立並維護一組閒置執行緒供全域重複利用,工作完成後將執行緒歸還池中,省去反覆建立銷毀的耗損。
    • 透過 ThreadPool.QueueUserWorkItem(...) 派工。
    • 適合執行時間短暫、頻繁發生的背景微型任務(現代 Task 底層亦基於此機制)。
      資料競爭(Race Condition):
  • 當多個執行緒同時讀寫同一個共享變數(Shared Resource),且最終結果取決於執行緒切換的先後時序時,就會發生資料競爭,導致數據計算錯誤(例如經典的「計數器數值遺失」或「銀行帳戶超額提款」)。
  • 例如 count++ 在底層其實分為三步驟:讀取值->加一->寫回值。若兩個執行緒在此期間交錯執行,部分累加就會被覆蓋。
    lock 關鍵字(互斥鎖):
  • 確保同一時間只有一個執行緒能進入受保護的關鍵程式區塊(Critical Section),其餘執行緒必須在門外排隊等待。
  • 編譯後等價於 Monitor.Enter 與 Monitor.Exit 搭配 try-finally 結構。
  • 鎖定物件的最佳實踐:
    • 宣告一個專屬的私有唯讀參考物件:private readonly object _lockObj = new object();。
    • 絕不要鎖定 this、typeof(MyClass) 或 string(字串拘留機制會造成不可預期的跨程式碼鎖定衝突)。

實作範例
https://ithelp.ithome.com.tw/upload/images/20261004/20178925PEIEGBKVKp.png

https://ithelp.ithome.com.tw/upload/images/20261004/20178925pwnFAITuiL.png

https://ithelp.ithome.com.tw/upload/images/20261004/20178925i7cDFyYWj4.png

https://ithelp.ithome.com.tw/upload/images/20261004/20178925hddrESKtrJ.png


上一篇
Day 20:資源釋放與記憶體管理
系列文
學習C#續 共 21 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言