求助:多线程编程死锁,帮忙看看程序!
程序如下:
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)怎么解锁?修改程序?
谢谢!!!
...全文
相关推荐
多线程死锁的产生以及如何避免死锁方法(详解)
### 总结理解死锁的产生原因和避免策略对于多线程编程非常重要。开发者应避免设计可能导致死锁的代码,合理规划资源的分配和释放,以提高程序的稳定性和效率。
C#多线程编程的坑:为什么你的锁总是死锁?
死锁是指两个或多个线程在运行过程中因争夺资源而造成的一个僵局,这些线程都在等待对方释放资源,导致无法继续执行。死锁是多线程编程中常见的难题,它通常是由于锁的管理不当引起的。通过理解死锁的基本概念,避免错误的锁顺序、设置超时机制、合理划分锁的粒度以及保护共享资源,我们可以有效地减少死锁发生的可能性。在多线程编程中,谨慎使用锁,并遵循良好的编程实践,能够显著提升程序的可靠性和性能。
Java多线程之死锁的出现和解决方法
使用线程池:使用线程池可以避免死锁的出现,因为线程池可以控制线程的执行顺序。死锁是多线程编程中一个常见的问题,解决死锁需要我们了解死锁的出现原因和解决方法。
Python多线程编程(五):死锁的形成
"本文主要探讨了Python多线程编程中的死锁问题,通过一个实例解释了死锁的形成过程,并提供了示例代码进行演示。"在多线程编程中,死锁是一个重要的概念,尤其在资源竞争激烈的环境中,正确理解和避免
Java多线程产生死锁的必要条件
避免死锁可以概括成三种方法:* 固定加锁的顺序(针对锁顺序死锁)* 开放调用(针对对象之间协作造成的死锁)* 使用定时锁(tryLock())死锁是一个非常重要的概念,在 Java 多线程编程中,我们需要了解死锁的必要条件



