如果你将mutex_c换成mutex_p,则不会死锁,因为,你第一个线程锁上后,切换到第二个线程,因为mutex_p未释放,第二个线程无法获取mutex_p,进入等待状态,此时OS将再次调度第一个线程,直到第一个线程释放mutex_p之后,第二个线程才会被激活,然后调试第二线程,获取mutex_p.
成都创新互联专注于企业全网整合营销推广、网站重做改版、蓬溪网站定制设计、自适应品牌网站建设、html5、商城网站建设、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为蓬溪等各大城市提供网站开发制作服务。
使用OS提供的互斥量来保护公共资源还是比较安全的,但如果用二值信号量的话,就可能会有优先级反转的情况.
#include stdio.h
#include string.h
#include stdlib.h
int main()
{
char password[10],password2[10];
memset(password,0,sizeof(password));
memset(password2,0,sizeof(password2));
printf("请设置8位数以内密码:\n\n");
scanf("%s",password);
printf("请设置校验密码:\n\n");
scanf("%s",password2);
if(atoi(password2)==atoi(password))
{
printf("密码输入正确!:\n");
}
else
{
printf("密码输入错误!:\n");
}
return 0;
}
#include reg52.h
#define uint unsigned int
#define uchar unsigned char
#define BIN(a,b,c,d,e,f,g,h) ((a7)+(b6)+(c5)+(d4)+(e3)+(f2)+(g1)+(h0))
//下面的code表示数组存放在ROM中,因为这个数组的值不需要改写
uchar code KeyCode[16]={15,14,12,8,30,28,24,16,60,56,48,32,120,112,96,64};//值为m*(n+1)的乘积,用于Key()
uchar dis[6];
msdelay(uint x)//延时子函数
{uchar j;
while(x--)
{for(j=0;j125;j++){;}
}
}
//键盘子程序一,键盘值与数组值对比得到
uchar Key(void)
{uchar temp,m,n,i,j,matrix,k;
P1=0xF0; /*行线电平为高,列线为低*/
temp=P10xf0;
if (temp==0xf0) return(16); /*行仍为高,无按健,退出*/
else msdelay(10);
for(i=1;i16;i=i*2)
{m=i;
for(j=1;j16;j=j*2)
{n=(~j)0x0f;
P1=(m4)|n; /*m为P1的行值由i循环得到,n为列值,由j循环并取反得到*/
temp=P10xf0;
if (!temp)
{do{temp=P10xf0;}while(!temp);
matrix=m*(n+1);/*为避免乘积重复,n+1*/
for(k=0;k16;k++){if (matrix==KeyCode[k]) return(k);} //KeyCode:见前
return(16);
} //if loop
}//j loop
}//i loop
}//Key end
//用Switch...case语句得到键盘值*/
uchar Key1(void)
{uchar temp,m,n,i,j,matrix;
P1=0xF0; /*行线电平为高,列线为低*/
temp=P10xf0;
if (temp==0xf0) return(16); /*行仍为高,无按健,退出*/
else msdelay(10);
for(i=1;i16;i=i*2)
{m=i;
for(j=1;j16;j=j*2)
{n=(~j)0x0f;
P1=(m4)|n;/*m为P1的行值由i循环得到,n为列值,由j循环并取反得到*/
temp=P10xf0;
if (!temp)
{do{temp=P10xf0;}while(!temp);
matrix=m*(n+1);
switch(matrix) //此方法的基本思路:
{case 15:return(1); break; //由循环得到的m,n值赋于P1端口实现逐个键扫描
case 14:return(2); break; //同时由m,n+1的值相乘得到对应键点de的积
case 12:return(3); break; //m*(n+1)值扫描键点对应而得出键值
case 8:return(4); break; //
case 30:return(5); break; //
case 28:return(6); break; //
case 24:return(7); break; //
case 16:return(8); break;
case 60:return(9); break;
case 56:return(0); break;
case 48:return(10); break;
case 32:return(11); break;
case 120:return(12); break;
case 112:return(13); break;
case 96:return(14); break;
case 64:return(15); break;
default:return(16);
} //switch end
} //if loop
}//j loop
}//i loop
}//Key end
//依次扫描16个按键
uchar Key2(void)
{uchar temp;
P1=0xF0; /*使P1=1111 0000,行线电平为高,列线为低*/
temp=P10xf0;
if (temp==0xf0) return(16); /*读P1=1111 xxxx,表示行仍为高,无按健,退出(x表示不关心)?/
else msdelay(10);
P1=0x1e; /*P1=0001 1110,行一为高,列一为低,扫描第一个按键*/
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(1);}
P1=0x1d; /*P1=0001 1101,行一为高,列二为低,扫描第二个按键,下面扫描其余按键*/
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(2);}
P1=0x1b;
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(3);}
P1=0x17;
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(4);}
P1=0x2e;
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(5);}
P1=0x2d;
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(6);}
P1=0x2b;
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(7);}
P1=0x27;
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(8);}
P1=0x4e;
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(9);}
P1=0x4d;
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(0);}
P1=0x4b;
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(10);}
P1=0x47;
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(11);}
P1=0x8e;
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(12);}
P1=0x8d;
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(13);}
P1=0x8b;
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(14);}
P1=0x87;
temp=P10xf0;
if (!temp) {do{temp=P10xf0;}while(!temp);
return(15);}
return(16); //扫描all按键都未按下,则输出16
}//Key2 end.
////////时钟中断显示子程序
void T0_int() interrupt 1
{static uchar i;
if (i==6){i=0;}
P0=5-i;
P0=P0|(dis[i]4);
i++;
TL0=0;
TH0=252;}
void distri(uint disnum)
{uint temp;
dis[0]=0;
dis[1]=disnum/10000;
temp=disnum%10000;
dis[2]=temp/1000;
temp=temp%1000;
dis[3]=temp/100;
temp=temp%100;
dis[4]=temp/10;
dis[5]=temp%10;
}
Main()
{uchar KeyVal,i=0;
TMOD=0x01;
IE=0x82;
TH0=252;
TL0=0;
TR0=1;
distri(0);
do{
KeyVal=Key();
if (KeyVal!=16) dis[1]=KeyVal; //注意:当有按键时才赋于显示位dis[1],否则出错,请分析!
}while(1);
}
有两种办法:
重载一个queue模板,把锁封装到重载的函数里
每次使用queue的函数的时候加锁,使用完毕后,解锁