信號量與互斥鎖之間的區別:spa
互斥量用於線程的互斥,信號線用於線程的同步。
這是互斥量和信號量的根本區別,也就是互斥和同步之間的區別。 線程
互斥:是指某一資源同時只容許一個訪問者對其進行訪問,具備惟一性和排它性。但互斥沒法限制訪問者對資源的訪問順序,即訪問是無序的。
同步:是指在互斥的基礎上(大多數狀況),經過其它機制實現訪問者對資源的有序訪問。在大多數狀況下,同步已經實現了互斥,特別是全部寫入資源的狀況一定是互斥的。少數狀況是指能夠容許多個訪問者同時訪問資源 資源
信號量經典舉例get
題目描述:白子和黑子各有32個,黑子先行,怎樣設置信號量,才能黑子先行,且是交替下子同步
解答:it
信號量: 基礎
白子可下嗎? s1 = 0方法
黑子可下嗎? s2 = 1im
白 黑margin
for(i=0;i<32;i++){ for(i=0;i<32;i++){
取子 取子
P(s1) P(s2)
放白子 放黑子
V(s2) V(s1)
} }
注意:正是由於設置了兩個信號量s2與s1,才實現了黑子先行的策略,由於一開始s2=1,s1=0,而黑子首先判斷的是s2,因此這個時候黑子能夠走了,而白字判斷的是S1,這個時候s1=0,因此,白字須要等待。黑子下完之後,講s1置爲1,這個時候白字才能走,很巧妙。
越獄》寄信
題目描述:T-boy給brad送信,Mike給Lincon送信,但他們送信收信都經過同一個樹洞。
信號量:
Lincon: 是否有Mike的信,s1 = 0
Brad: 是否有T-boy的信,s2 = 0
Mike和T-boy: 樹洞是否爲空,s3 = 1
Mike: T-boy: Lincon: Brad:
write() write() P(s1) P(s2)
P(s3) P(s3) getit() getit()
putit() putit() V(s3) V(s3)
V(s1) V(s2) readit() readit()
題目描述:四我的進行接力賽跑,要求使用信號量的方法使得跑的順序是P1->P2->P3->P4
解答:
信號量:
s2:2號接棒 0
s3:3號接棒 0
s4:4號接棒 0
P1 P2 P3 P4
P(s2) P(s3) P(s4)
run run run run
V(s2) V(s3) V(s4)