3 回答

TA貢獻1783條經驗 獲得超4個贊
它們不是一回事。它們用于不同的目的!
雖然兩種類型的信號量都具有完整/空狀態并使用相同的API,但它們的使用方式卻截然不同。
互斥信號量
互斥信號量用于保護共享資源(數據結構,文件等)。
Mutex信號量由接受它的任務“擁有”。如果任務B嘗試semGive當前由任務A持有的互斥鎖,則任務B的調用將返回錯誤并失敗。
互斥鎖始終使用以下順序:
- SemTake - 關鍵部分 - SemGive
這是一個簡單的例子:
線程A線程B. 以Mutex為例 訪問數據 ......拿Mutex <==將阻止 ... 提供互斥鎖訪問數據<==取消阻止 ... 給Mutex
Binary Semaphore
Binary Semaphore解決了一個完全不同的問題:
任務B等待發生某事(例如傳感器被絆倒)。
傳感器跳閘和中斷服務程序運行。它需要通知行程的任務。
任務B應該運行并對傳感器跳閘采取適當的措施。然后回去等。
Task A Task B ... Take BinSemaphore <== wait for something Do Something Noteworthy Give BinSemaphore do something <== unblocks
請注意,對于二進制信號量,B可以使用信號量和A來提供它。
同樣,二進制信號量不保護資源不被訪問。給予和獲取信號量的行為從根本上是分離的。
對于相同的任務而言,通常對于給予和獲取相同的二進制信號量沒有多大意義。

TA貢獻1813條經驗 獲得超2個贊
廁所的例子是一個令人愉快的比喻:
互斥:
是廁所的關鍵。一個人可以擁有鑰匙 - 占用廁所 - 當時。完成后,該人員將(釋放)密鑰提供給隊列中的下一個人。
正式說:“互斥鎖通常用于序列化對一部分重入代碼的訪問,這些代碼不能由多個線程同時執行?;コ鈱ο笾辉试S一個線程進入受控部分,強制其他線程嘗試訪問該部分要等到第一個線程退出該部分?!?nbsp;參考:Symbian開發人員庫
(互斥體實際上是一個值為1的信號量。)
信號:
是免費相同的廁所鑰匙的數量。例如,我們說有四個帶有相同鎖和鑰匙的馬桶。信號量計數 - 鍵數 - 在開始時設置為4(所有四個廁所都是免費的),然后計數值隨著人們的進入而減少。如果所有廁所都已滿,即。沒有剩余的自由鍵,信號量計數為0.現在,當eq。一個人離開廁所,信號量增加到1(一個自由鍵),并給予隊列中的下一個人。
正式地說:“信號量將共享資源的同時用戶數量限制為最大數量。線程可以請求訪問資源(遞減信號量),并且可以發信號通知他們已經完成了使用資源(遞增信號量)。 “ 參考:Symbian開發人員庫

TA貢獻1856條經驗 獲得超5個贊
Mutex只能由獲取它的線程釋放,而您可以從任何其他線程(或進程)發出信號量信號,因此信號量更適合某些同步問題,如producer-consumer。
在Windows上,二進制信號量更像是事件對象而不是互斥體。
- 3 回答
- 0 關注
- 1443 瀏覽
添加回答
舉報