[英]Why there is deadlock while using mutex in pthread?
下面給出的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;
}
這里的死鎖可能是由於誤用pthread_cond_wait()
造成的。 您通常希望在循環中調用pthread_cond_wait()
,檢查條件,例如。
while (!cond)
pthread_cond_wait(...);
由於pthread_cond_signal()
只會喚醒當時在pthread_cond_wait()
上休眠的線程,如果信令線程先運行,服務員將永遠不會喚醒。
這里的其他問題是你在線程完成之前破壞你的條件變量和互斥量,這通常會導致意外的行為。 在pthread_join()
資源之前,你應該pthread_join()
線程。 您也永遠不會初始化條件變量。
一個問題是你永遠不會初始化條件變量。 另一個是你破壞互斥鎖(並嘗試銷毀未初始化的條件變量),而使用它們的線程仍然可以運行。
不需要使用init函數動態初始化靜態互斥鎖或條件,也不需要在最后銷毀它們。 在變量mut
和cond
的定義中使用PTHREAD_MUTEX_INITIALIZER
和PTHREAD_COND_INITIALIZER
:
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t con = PTHREAD_COND_INITIALIZER;
然后擦除對_init
和_destroy
函數的所有調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.