求助:多线程编程死锁,帮忙看看程序!

askaily 2008-06-17 07:57:05
程序如下:
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)怎么解锁?修改程序?
谢谢!!!
...全文
108 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
askaily 2008-06-19
  • 打赏
  • 举报
回复
想了想,程序还可以简洁点:
void Task1(void * pParam)
{
char err;
void * Param;
Param = pParam;
while(1)
{
OSSemPend(sem_1,0,&err);
my_char++;
printf("%c",my_char);
OSSemPost(sem_1);
if ('z' == my_char)
{
OSSemPend(sem_2,0,&err);
MY_CHAR='a';
OSSemPost(sem_2);
}
}
}

void task2同样修改!欢迎大家多多指点!
askaily 2008-06-17
  • 打赏
  • 举报
回复
谢谢回答!这个程序是我特意写的一个死锁的例子!虾米刚开始接触,想加深理解!谢谢指教!
bshawk 2008-06-17
  • 打赏
  • 举报
回复
另外,建议你将sem的创建放到线程创建之前!
bshawk 2008-06-17
  • 打赏
  • 举报
回复
死锁典型情况:
线程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);
}

}
}


23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧