信號量與互斥鎖之間的區別:
互斥量用於線程的互斥,信號線用於線程的同步。
這是互斥量和信號量的根本區別,也就是互斥和同步之間的區別。
互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。
同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源
信號量經典舉例
題目描述:白子和黑子各有32個,黑子先行,怎樣設置信號量,才能黑子先行,且是交替下子
解答:
信號量:
白子可下嗎? s1 = 0
黑子可下嗎? s2 = 1
白 黑
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)