1. 程式人生 > >線程死鎖例子

線程死鎖例子

pes 使用 lee lock logs ini 釋放 null mut

/*  頭文件 */  
#include <stdio.h>  
#include <stdlib.h>  
#include <sys/types.h>  
#include <pthread.h>  
#include <signal.h>  
  
pthread_mutex_t mutex_one,mutex_two;  
pthread_mutex_t mutex;  
pthread_cond_t cond;  
  
void *thread_routine_one(void *arg)  
{  
    pthread_cond_wait(
&cond,&mutex);//確保two線程先運行 printf("thread_routine_one: lock mutex_one!\n"); pthread_mutex_lock(&mutex_one); printf("thread_routine_one: lock mutex_two!\n"); pthread_mutex_lock(&mutex_two);//獲取two鎖,這個要等待two線程對two鎖的釋放 sleep(1); printf("thread_routine_one: unlock mutex_two!\n
"); pthread_mutex_unlock(&mutex_two); printf("thread_routine_one: unlock mutex_one!\n"); pthread_mutex_unlock(&mutex_one); return NULL; } void *thread_routine_two(void *arg) { printf("thread_routine_two: lock mutex_two!\n"); pthread_mutex_lock(
&mutex_two);//獲取two鎖 pthread_cond_signal(&cond);//讓one線程運行 sleep(1);//休眠,讓one可以先運行獲取one鎖 printf("thread_routine_two: lock mutex_one!\n"); pthread_mutex_lock(&mutex_one);//獲取one鎖,這個同樣必須等待one線程多one鎖的釋放 /**這時出現死鎖現象了,在two線程要等待one線程對one鎖的釋放,同時two鎖沒有釋放 * 然而在one線程需要等待two線程對two鎖的釋放,然後才會對one鎖的釋放!出現相互等待的過程**/ printf("thread_routine_two: unlock mutex_one!\n"); pthread_mutex_unlock(&mutex_one); printf("thread_routine_two: unlock mutex_two!\n"); pthread_mutex_unlock(&mutex_two); return NULL; } void main() { pthread_t pthread_one,pthread_two; pthread_mutex_init(&mutex_one,NULL); pthread_mutex_init(&mutex_two,NULL); pthread_mutex_init(&mutex,NULL); pthread_cond_init(&cond,NULL); pthread_create(&pthread_one,NULL,thread_routine_one,NULL); pthread_create(&pthread_two,NULL,thread_routine_two,NULL); while(1) sleep(1); }

線程程A已經擁有至少一個資源,此時又去申請其他資源,而該資源又正在被B線程使用,而同時B線程也在等待A線程的資源釋放後才會釋放自己的資源,便會造成死鎖。此時請求進程阻塞,但對自己已經獲得的資源保持不放,

線程死鎖例子