鍍金池/ 問答/C  Linux/ 用條件變量時(shí)信號(hào)為什么不會(huì)丟失?

用條件變量時(shí)信號(hào)為什么不會(huì)丟失?

條件變量典型的用法如下:

pthread_mutex_lock(&m);
while(c==true)
    pthread_cond_wait(&cond, &m);
dosomething();
pthread_mutex_unlock(&m);

1、主線程中調(diào)用pthread_cond_wait時(shí)會(huì)釋放互斥鎖,然后掛起主線程,并等待條件變量的發(fā)生變化,當(dāng)其他線程調(diào)用pthread_cond_signal時(shí),如果互斥鎖是被鎖住的,那么主線程中的pthread_cond_wait會(huì)等互斥待鎖被解鎖后,然后再給互斥鎖上鎖后再返回嗎?

2、如果正如1中的描述那樣的話,pthread_cond_wait收到了pthread_cond_signal發(fā)來的信號(hào),但是未鎖定互斥鎖之前,又被其他線程搶了先,鎖住了互斥鎖,那不是pthread_cond_wait還得掛起等待互斥鎖被解鎖?

3、如果可以的話,希望能幫助理清一下這個(gè)程序的執(zhí)行流程。

回答
編輯回答
陌南塵

pthread_cond_signal不會(huì)發(fā)生你所說的第二種情況。pthread_cond_signal調(diào)用的時(shí)候,會(huì)喚醒正在等待該條件的線程,如果不止一個(gè)線程正在等待,則選擇一個(gè)喚醒(注意這里是選擇一個(gè),所以不可能有多個(gè)等待線程同時(shí)被喚醒),一般是按照時(shí)間順序喚醒,最先等待的最先被喚醒。

但是第二種情況在使用pthread_cond_broadcast的時(shí)候是有可能發(fā)生的。pthread_cond_broadcast會(huì)喚醒所有正在等待的線程,讓它們自己去競爭鎖,誰能拿到誰就繼續(xù)執(zhí)行,否則就繼續(xù)阻塞。

2017年2月19日 10:39