#include<reg51.h>
#define uchar unsigned char
uchar mima[4]={1,2,3,4}
uchar keymm[4]={0,0,0,0}
sbit key1=P1^0
sbit key2=P1^1
sbit key3=P1^2
sbit key4=P1^3
sbit led=P1^4
bit flag=0
void delay(uchar a)
{
uchar i
while(a--)for(i=0i<120i++)
}
main()
{
uchar i
led=1
while(1)
{
if(key1==0)
{
while(key1==0)
keymm[0]++
keymm[0]%=10
}
if(key2==0)
{
while(key2==0)
keymm[1]++
keymm[1]%=10
}
if(key3==0)
{
while(key3==0)
keymm[2]++
keymm[2]%=10
}
if(key4==0)
{
while(key4==0)
keymm[3]++
keymm[3]%=10
}
for(i=0i<4i++)
{
if(keymm[i]!=mima[i])break
if(i==3)flag=1
}
if(flag)
{
i=10
while(i--)
{
led=~led
delay(100)
}
flag=0
}
}
}
如果你将mutex_c换成mutex_p,则不会死锁,因为,你第一个线程锁上后,切换到第二个线程,因为mutex_p未释放,第二个线程无法获取mutex_p,进入等待状态,此时OS将再次调度第一个线程,直到第一个线程释放mutex_p之后,第二个线程才会被激活,然后调试第二线程,获取mutex_p.使用OS提供的互斥量来保护公共资源还是比较安全的,但如果用二值信号量的话,就可能会有优先级反转的情况.