0

下面给出的 Pthread 程序演示了 pthread 中的互斥锁示例。但是,在运行此代码时,大多数情况下都会发生死锁,从而为某些运行提供正确的结果。

#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
volatile int sv=10;
volatile int x,y,temp=10;
pthread_mutex_t mut;
pthread_cond_t con;
void *ChildThread(void *arg)
{
pthread_mutex_lock (&mut);
pthread_cond_wait(&con, &mut);  
x=sv;
x++;
sv=x;
printf("The child sv is %d\n",sv);
pthread_mutex_unlock (&mut);
pthread_exit(NULL);
}

void *ChildThread2(void *arg)
{
pthread_mutex_lock (&mut);
y=sv;
y--;
sv=y;
printf("The child2 sv is %d\n",sv); 
pthread_cond_signal(&con);
pthread_mutex_unlock (&mut);
pthread_exit(NULL);
}

int main(void)
{
pthread_t child1,child2,child3;
pthread_mutex_init(&mut, NULL);
pthread_create(&child2,NULL,ChildThread2,NULL);
pthread_create(&child1,NULL,ChildThread,NULL);
pthread_cond_destroy(&con);
pthread_mutex_destroy(&mut);
pthread_join(child1,NULL);
pthread_join(child2,NULL);
return 0;
}
4

3 回答 3

2

您在这里的僵局很可能是由于滥用pthread_cond_wait(). 您通常希望pthread_cond_wait()在循环中调用,检查条件,例如。

while (!cond)
    pthread_cond_wait(...);

由于此时pthread_cond_signal()只会唤醒一个正在休眠的线程pthread_cond_wait(),因此如果信号线程先运行,则服务员将永远不会醒来。

这里的其他问题是您在线程完成之前破坏了条件变量和互斥锁,这通常会导致意外行为。你应该pthread_join()在拿走他们的资源之前线程。您也永远不会初始化条件变量。

于 2013-09-23T10:00:52.097 回答
0

一个问题是您从不初始化条件变量。另一个是您销毁互斥锁​​(并尝试销毁未初始化的条件变量),而使用它们的线程仍然可以运行。

于 2013-09-23T10:00:00.167 回答
0

无需使用 init 函数动态初始化静态互斥锁或条件,也无需在最后销毁它们。在变量的定义处使用PTHREAD_MUTEX_INITIALIZERand :PTHREAD_COND_INITIALIZERmutcond

pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t con = PTHREAD_COND_INITIALIZER;

然后清除所有调用_init_destroy函数。

于 2013-09-23T10:08:08.247 回答