簡體   English   中英

為什么在pthread中使用互斥時會出現死鎖?

[英]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函數動態初始化靜態互斥鎖或條件,也不需要在最后銷毀它們。 在變量mutcond的定義中使用PTHREAD_MUTEX_INITIALIZERPTHREAD_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM