粉絲的提問,必須安排。
兩個線程,兩個互斥鎖如何形成死鎖?
程序流程圖如下:
如上圖所示:
-
t0時刻,主線程創(chuàng)建子線程,并初始化互斥鎖mutex1、mutex2; -
t1時刻,主線程申請到了mutex1、子線程申請到了mutex2; -
t2時刻,主線程和子線程都sleep 1秒鐘,防止優(yōu)先獲得時間片的線程直接申請到了另外1個互斥鎖,導(dǎo)致程序直接退出; -
t3時刻,主線程和子線程都想獲得對方手里的互斥鎖,但是對方都來不及釋放自己手里的鎖; -
t4時刻,主線程和子線雙雙進入休眠。
【注意】為了保證主線程和子線程都能夠分別獲得鎖mutex1、mutex2,各自獲得鎖后一定要先sleep 1秒鐘,否則創(chuàng)建完子線程后,主線程還有一定的時間片,主線程會申請到鎖mutex2,無法形成死鎖。
源碼如下
#include?
#include?
#include?
#include????
unsigned?int?value1,?value2,?count;
pthread_mutex_t??mutex1,mutex2;
void?*function(void?*arg);
void??*function(void?*arg)
{
?pthread_mutex_lock(&mutex2);
?printf("new?thread?get?mutex2\n");?
?sleep(1);
?pthread_mutex_lock(&mutex1);?
?printf("new?thread?get?mutex1\n");?
?
?
?pthread_mutex_unlock(&mutex1);
?printf("new?thread?release?mutex1\n");
?pthread_mutex_unlock(&mutex2);?
?printf("new?thread?release?mutex2\n");
????return??NULL;
?}??
int?main(int?argc,??char?*argv[])
{
?pthread_t??a_thread;
?????????
?if?(pthread_mutex_init(&mutex1,?NULL)?0)
?{
??perror("fail?to?mutex_init");
??exit(-1);
?}
??if?(pthread_mutex_init(&mutex2,?NULL)?0)
?{
??perror("fail?to?mutex_init");
??exit(-1);
?}??????????????
?if?(pthread_create(&a_thread,?NULL,?function,?NULL)?0)
?{???
??perror("fail?to?pthread_create");?????
??exit(-1);
?}
????while?(?1?)
????{
????????pthread_mutex_lock(&mutex1);
??printf("main?thread?get?mutex1\n");
??sleep(1);
????????pthread_mutex_lock(&mutex2);??
??printf("main?thread?get?mutex2\n");
????????pthread_mutex_unlock(&mutex2);
??printf("main?thread?release?mutex2\n");
????????pthread_mutex_unlock(&mutex1);
??printf("main?thread?release?mutex1\n");
????}
????return?0;
?}?????????????
編譯運行
從執(zhí)行結(jié)果可以判斷,主線程和子線程分別獲得了互斥鎖mutex1、mutex2,sleep 1秒后,他們都想再分別申請mutex2、mutex1,而雙方都不想釋放自己手中的鎖,鎖已形成了死鎖,程序就一直處于休眠狀態(tài)。
查看下該進程的線程
查看進程ID,為4204查看該進程創(chuàng)建的線程id:4204、4205。
-THE END-
推薦閱讀
【3】Linux面試題100道,看看會多少?必讀
本公眾號全部原創(chuàng)干貨已整理成一個目錄,點擊「干貨」或者回復(fù) 1024?即可獲得。
想加入嵌入式技術(shù)交流群請加一口君微信
一口君有問必答
免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!