下面给出的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;
}
答案 0 :(得分:2)
这里的僵局可能是由于误用了pthread_cond_wait()
造成的。
您通常希望在循环中调用pthread_cond_wait()
,检查条件,例如
while (!cond)
pthread_cond_wait(...);
由于pthread_cond_signal()
只会唤醒当时在pthread_cond_wait()
上休眠的线程,如果信令线程先运行,服务员将永远不会醒来。
这里的其他问题是你在线程完成之前破坏你的条件变量和互斥锁,这通常会导致意外的行为。在取走资源之前,你应该pthread_join()
线程。
您也永远不会初始化条件变量。
答案 1 :(得分:0)
一个问题是你永远不会初始化条件变量。另一个是你销毁互斥锁(并尝试销毁未初始化的条件变量),而使用它们的线程仍然可以运行。
答案 2 :(得分:0)
不需要使用init函数动态初始化静态互斥锁或条件,也不需要在最后销毁它们。在变量[{1}}和PTHREAD_MUTEX_INITIALIZER
的定义中使用PTHREAD_COND_INITIALIZER
和mut
:
cond
然后删除对pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t con = PTHREAD_COND_INITIALIZER;
和_init
个函数的所有来电。