pthread_join()
pthread_join()會掛起父執行緒,直至子執行緒完成才可以執行後面的程式碼,此外,一個PTHREAD_CREATE_JOINABLE狀態的子執行緒不會自動釋放該執行緒的記憶體資源,包括執行緒描述符和其使用的棧;而主執行緒呼叫pthread_detach()時,無需等待子執行緒的完成,它可以立即執行後面的程式碼,當然,也有可能主執行緒執行完之後銷燬程式,導致子執行緒未能執行.
為了很好的說明互斥鎖,我們使用一個例項來進行說明. 假設cond表示條件變數.mutex表示互斥鎖.x==y表示我們要滿足的測試條件.我們可以有下面的虛擬碼:
#include
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond =PTHREAD_COND_INITIALIZER;
static int x = 1;
staitc int y = 2;
/* 下面的這個程式碼用來檢測條件x==y是否成立. */
1) pthread_mutex_lock(&mutex);
2) while(x!=y)
3) pthread_cond_wait(&cond,&mutex);
4) .... /* 進行我們的操作 */
5) pthread_mutex_unlock(&mutex);
/* 下面的程式碼用來改變x,y的值,使它們去滿足一定的條件 */
6) pthread_mutex_lock(&mutex);
7) x++;
8) pthread_cond_signal(&cond);
9) pthread_mutex_unlock(&mutex);
我們來分析一下上面的虛擬碼.
我們考慮一個執行緒從1)開始執行,一個從6)開始執行.如果執行緒一首先開始執行了1)鎖住了 mutex然後執行了2)進行條件測試.由於我們的x!=y成立,然後執行緒執行3)執行緒這個時候阻塞了.按照執行緒條件變數的要求,執行緒在阻塞之前隱式的(沒有呼叫pthread_mutex_unlock) 來釋放互斥鎖.這個時候執行緒二開始執行6).由於執行緒一隱式的釋放了互斥鎖,所以執行緒二獲得了互斥鎖.可以執行7)接著執行8).這個時候執行緒二喚醒執行緒一,同時執行緒二繼續執行. 執行緒一接收到了訊號,由於執行緒一在pthread_cond_wait中隱式的釋放了互斥鎖,所以這個時候執行緒一又隱式的去鎖住互斥鎖不過這個時候互斥鎖還被執行緒二擁有,所以執行緒一在隱式的鎖住互斥鎖處阻塞.直到執行緒二執行完9)以後,執行緒一才從3返回,由於執行緒一不知道條件是否成立,所以執行緒繼續執行2)測試條件.條件成立,執行緒一開始執條件是否成立,所以執行緒繼續執行2)測試條件.條件成立,執行緒一開始執行其它操作. 由於我們隱式的鎖住了互斥鎖,所以最後要釋放互斥鎖. 從上面的分析和從pthread_cond_wait的原型我們可以"猜測"一下pthread_cond_wait所執行的操作
/* 注意實際情況肯定不是這樣的,我這樣寫只是我們更容易離解一些 */
...
/* 從pthread_cond_wait中隱式的釋放互斥鎖 */
1) pthread_mutex_unlock(&mutex);
... /* 阻塞 */
/* 從pthread_cond_wait中隱式的鎖住互斥鎖 */
2) pthread_mutex_lock(&mutex);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23168012/viewspace-1045836/,如需轉載,請註明出處,否則將追究法律責任。