c语言用锁锁住一个函数,怎样锁住函数

(C语言中)互斥锁的死锁问题

如果你将mutex_c换成mutex_p,则不会死锁,因为,你第一个线程锁上后,切换到第二个线程,因为mutex_p未释放,第二个线程无法获取mutex_p,进入等待状态,此时OS将再次调度第一个线程,直到第一个线程释放mutex_p之后,第二个线程才会被激活,然后调试第二线程,获取mutex_p.

成都创新互联专注于企业全网整合营销推广、网站重做改版、蓬溪网站定制设计、自适应品牌网站建设、html5商城网站建设、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为蓬溪等各大城市提供网站开发制作服务。

使用OS提供的互斥量来保护公共资源还是比较安全的,但如果用二值信号量的话,就可能会有优先级反转的情况.

密码锁c语言编程代码

#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;

}

求51单片机C语言编的密码锁程序

#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);

}

C语言queue如何加锁和解锁

有两种办法:

重载一个queue模板,把锁封装到重载的函数里

每次使用queue的函数的时候加锁,使用完毕后,解锁


文章名称:c语言用锁锁住一个函数,怎样锁住函数
文章地址:http://scjbc.cn/article/phijsp.html

其他资讯