信號量 與 互斥量的區別

信號量 與 互斥量(鎖)的區別

 


一、概念和定義
    信號量:多線程同步使用的;一個線程完成某個動作後通過信號告訴別的線程,別的線程纔可以執行某些動作;
    互斥量:多線程互斥使用的;一個線程佔用某個資源,那麼別的線程就無法訪問,直到該線程離開,其他線程纔可以訪問該資源;


二、信號量 與 互斥量的區別

    1、互斥量用於線程的互斥,信號量用於線程的同步:
        互斥:指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排他性。但是互斥無法限制訪問者對資源的訪問順序,所以訪問是無序的;
        同步:指在互斥的基礎上(多數情況),通過其他機制實現訪問者對資源的有序訪問。大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況指可以允許多個訪問者同時訪問資源。

    2、互斥量值只能是0/1,信號量值可以爲非負整數:
        一個互斥量只能用於一個資源的互斥訪問不能實現多個資源的多線程互斥問題;
        一個信號量可以實現多個同類資源的多線程互斥和同步。當信號量爲單值信號量時,也可以完成一個資源的互斥訪問;

    3、互斥量的加鎖和解鎖必須由同一線程分別對應使用;而信號量可以由一個線程釋放,另外一個線程得到。

    


三、信號量與互斥量的詳細分析
    信號量--Semaphore:
        分類:
            二進制信號量(Binary Semaphore):只允許信號量取0或1值,其同時只能被一個線程獲取;
            整型信號量(Integer Semaphore):信號量取值是整數,可被多個線程同時獲得,直到信號量的值變爲0;
            記錄型信號量(Record Semaphore):每個信號量s除以一個整數值value(計數)外,還有一個等待隊列List,其中是阻塞在該信號量的各個線程的標識。
                當信號量被釋放1個,值被加1後,系統自動從等待隊列中喚醒一個等待中的線程;讓其獲得信號量,同時信號量再減1。
                
        Semaphore 抽象操作:
            create() / wait() / post() / trywait() / destroy()
    
    互斥量--Mutex:
        互斥量表現互斥現象的數據結構,常用作保護從中斷來的臨界段代碼並且在共享同步使用的資源;
        Mutex本質就是一把鎖,提供對資源的獨佔式訪問,所以Mutex主要的作用是互斥。
        Mutex 抽象操作:
            create() / lock() / unlock() / destroy()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章