当前位置: 技术问答>linux和unix
求助:多线程编程死锁,帮忙看看程序!
来源: 互联网 发布时间:2016-03-26
本文导语: 程序如下: void TaskStart(void * pParam) { OSTaskCreate(Task1, 0, &TaskStk[1][TASK_STK_SIZE-1], Task1_Prio); OSTaskCreate(Task2, 0, &TaskStk[2][TASK_STK_SIZE-1], Task2_Prio); sem_1 = OSSemCreat(1); sem_2 = OSSemCreat(1); } void Ta...
程序如下:
void TaskStart(void * pParam)
{
OSTaskCreate(Task1, 0, &TaskStk[1][TASK_STK_SIZE-1], Task1_Prio);
OSTaskCreate(Task2, 0, &TaskStk[2][TASK_STK_SIZE-1], Task2_Prio);
sem_1 = OSSemCreat(1);
sem_2 = OSSemCreat(1);
}
void Task1(void * pParam)
{
char err;
void * Param;
Param = pParam;
while(1)
{
OSSemPend(sem_1,0,&err);
my_char++;
if ('z' == my_char)
{
OSSemPend(sem_2,0,&err);
MY_CHAR='a';
OSSemPost(sem_2);
}
printf("%c",my_char);
OSSemPost(sem_1);
}
}
void Task2(void * pParam)
{
char err;
void * Param;
Param = pParam;
while(1)
{
OSSemPend(sem_2,0,&err);
MY_CHAR++;
if ('Z' == MY_CHAR)
{
OSSemPend(sem_1,0,&err);
my_char = 'A';
OSSemPost(sem_1);
}
printf("%c",MY_CHAR);
OSSemPost(sem_2);
}
}
请教:
(1)发生死锁的原因是什么?
(2)怎么解锁?修改程序?
谢谢!!!
void TaskStart(void * pParam)
{
OSTaskCreate(Task1, 0, &TaskStk[1][TASK_STK_SIZE-1], Task1_Prio);
OSTaskCreate(Task2, 0, &TaskStk[2][TASK_STK_SIZE-1], Task2_Prio);
sem_1 = OSSemCreat(1);
sem_2 = OSSemCreat(1);
}
void Task1(void * pParam)
{
char err;
void * Param;
Param = pParam;
while(1)
{
OSSemPend(sem_1,0,&err);
my_char++;
if ('z' == my_char)
{
OSSemPend(sem_2,0,&err);
MY_CHAR='a';
OSSemPost(sem_2);
}
printf("%c",my_char);
OSSemPost(sem_1);
}
}
void Task2(void * pParam)
{
char err;
void * Param;
Param = pParam;
while(1)
{
OSSemPend(sem_2,0,&err);
MY_CHAR++;
if ('Z' == MY_CHAR)
{
OSSemPend(sem_1,0,&err);
my_char = 'A';
OSSemPost(sem_1);
}
printf("%c",MY_CHAR);
OSSemPost(sem_2);
}
}
请教:
(1)发生死锁的原因是什么?
(2)怎么解锁?修改程序?
谢谢!!!
|
死锁典型情况:
线程1持有Sem1,要获取Sem2;而线程2持有Sem2要获取Sem1!这样线程1永远无法获取Sem2,线程2也永远无法获取Sem1.死翘翘了。 我看你这个程序就太典型了,简直量身定做!
不知道你这个程序做什么用,看着怪怪!
线程1持有Sem1,要获取Sem2;而线程2持有Sem2要获取Sem1!这样线程1永远无法获取Sem2,线程2也永远无法获取Sem1.死翘翘了。 我看你这个程序就太典型了,简直量身定做!
不知道你这个程序做什么用,看着怪怪!
void Task1(void * pParam)
{
char err;
void * Param;
Param = pParam;
while(1)
{
OSSemPend(sem_1,0,&err);
my_char++;
printf("%c",my_char);
if ('z' == my_char)
{
OSSemPost(sem_1);
OSSemPend(sem_2,0,&err);
MY_CHAR='a';
OSSemPost(sem_2);
}
else
{
OSSemPost(sem_1);
}
}
}
void Task2(void * pParam)
{
char err;
void * Param;
Param = pParam;
while(1)
{
OSSemPend(sem_2,0,&err);
MY_CHAR++;
printf("%c",MY_CHAR);
if ('Z' == MY_CHAR)
{
OSSemPost(sem_2);
OSSemPend(sem_1,0,&err);
my_char = 'A';
OSSemPost(sem_1);
}
else
{
OSSemPost(sem_2);
}
}
}