在多線程編程中驰坊,線程的同步是一個宏觀的概念荡陷,其實其內(nèi)部的實現(xiàn)包含兩個部分:一是互斥励两,二是線程之間的相互依賴關系噩茄。
就好像是一個團隊開發(fā)一個軟件項目,加入有兩個小組续徽,分別是:研發(fā)小組和測試小組蚓曼。按照我們的經(jīng)驗,一個軟件項目钦扭,只有當研發(fā)小組將其開發(fā)出來以后纫版,測試小組才可以對其進行測試,這說明測試小組是依賴于研發(fā)小組的客情。如果我們把該軟件項目看成是一個共享資源其弊,這個情景就可以看作是一個線程的同步問題。
為了實現(xiàn)線程的同步膀斋,我們引入條件變量瑞凑。條件變量的內(nèi)部是一個等待隊列,用于放置等待的線程概页,線程在條件變量中等待通知籽御。
對于等待變量的操作,也是對一個共享資源的操作惰匙,所以也需要互斥鎖對其進行保護技掏。所以在線程同步的問題中,互斥鎖和等待變量常常是一起使用的项鬼。
我們使用pthread_cond_wait(pthread_cond_t * cond,pthread_mutex_t * mutex)這一函數(shù)來實現(xiàn)等待變量的等待操作哑梳。
這里就要好好說一下pthread_cond_wait(pthread_cond_t * cond,pthread_mutex_t * mutex)這一函數(shù)的內(nèi)部實現(xiàn)原理:
偽代碼說明:
pthread_cond_wait(pthread_cond_t * cond,pthread_mutex_t * mutex)
{
1、unlock(mutex);//這里首先要將互斥鎖打開绘盟,
2鸠真、lock(mutex);//然后使用互斥鎖上鎖
3、將線程自己插入到條件變量的等待隊列當中
4龄毡、unlock(&mutex);
5吠卷、當前等待的線程阻塞<--------等待其他線程通知喚醒
6、該線程被喚醒以后沦零,lock(&mutex);
7祭隔、將自己從等待隊列中刪除
}
這就能解釋為什么在下圖中,pthread_cond_wait(&r-> cond,&r->mutex)放在pthread_mutex_unlock(&r->mutex)之前路操。