線程死鎖例子
阿新 • • 發佈:2017-08-24
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線程的資源釋放後才會釋放自己的資源,便會造成死鎖。此時請求進程阻塞,但對自己已經獲得的資源保持不放,
線程死鎖例子