互斥鎖與號誌的差異:比較互斥與同步
互斥鎖用來保護臨界區段,讓同一時間只有一個執行緒能使用共享資源。鎖定的執行緒也必須由它自己解鎖。號誌是一個計數器,用來控制同時能使用有限資源的執行緒數量,也可用來從一個執行緒向另一個執行緒通知事件。互斥鎖是為了擁有與互斥,號誌則是為了計數與通知。
| 項目 | 互斥鎖 | 號誌 |
|---|---|---|
| 目的 | 互斥。同一時間只有一個執行緒能進入臨界區段 | 計數。限制對 N 個資源池的存取,或在執行緒之間通知事件 |
| 值 | 鎖定中或未鎖定(二值) | 0 以上的整數計數(只有 0 或 1 的情形稱為二元號誌) |
| 擁有者 | 由鎖定的執行緒持有,也應由該執行緒解鎖 | 沒有擁有者。任何執行緒都能發出 post 或 signal |
| 操作 | 鎖定與解鎖 | wait(P,減少)與 post(V,增加) |
| 執行緒間的訊號 | 不在設計考量內 | 可以使用。例如生產者通知消費者 |
| 優先權反轉 | 多半可用優先權繼承來避免 | 通常不支援 |
| 主要用途 | 保護清單或計數器等共享資料結構 | 限制連線池、容量有限的生產者、消費者緩衝區、從中斷處理常式向工作任務通知 |
| 常見陷阱 | 鎖定順序不一致造成的死結、忘記解鎖 | 計數不吻合造成的訊號遺漏與死結 |
數值為具代表性的大致參考值,會因世代或產品而異。