信号量与互斥锁之间的区别: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)