在《執行緒同步—互斥鎖》一文中,我們分析了只用互斥鎖同步執行緒的弊端——cpu的效率和時效性不可兼得。下面,我們通過使用條件變數,在保證cpu效率的前提下,提高程式的時效性。
只用互斥鎖同步執行緒,其cpu佔用率之所以高,是因為執行緒需要輪詢,即需要不停的檢查條件是否滿足。我們使用條件變數,當條件不滿足時,使執行緒阻塞。一旦條件滿足,就會解除阻塞,繼續往下執行。這樣,執行緒就不需要輪詢了,因此不需要占用太多cpu資源,而且具有很高的及時性。
當條件滿足時,可以喚醒單個阻塞的執行緒,也可以喚醒多個執行緒。注釋掉的**段,是喚醒多個執行緒的。**如下:
#include
#include
char buffer[128];
int buffer_has_data=0;
pthread_mutex_t mutex;//鎖定標誌
pthread_cond_t cond;//喚醒條件變數
void write_buffer(char *data)
pthread_mutex_unlock(&mutex);//解鎖
}void read_buffer(void)
printf("read buffer,data = %s\n",buffer);
buffer_has_data=0;
pthread_mutex_unlock(&mutex);//解鎖 }}
/*void test1() }
void test2()}*/
int main(int argc,char **argv)
pthread_join(reader,null);//等待執行緒退出
pthread_join(t1,null);
pthread_join(t2,null);
pthread_cond_destroy(&cond);//釋放阻塞喚醒變數
pthread_mutex_destroy(&mutex);//釋放互斥鎖mutex資源
return 0;
}
同步執行緒 條件變數與互斥鎖
一。互斥量和條件變數簡介 互斥量 mutex 從本質上說是一把鎖,在訪問共享資源前對互斥量進行加鎖,在訪問完成後釋放互斥量上的鎖。對互斥量進行加鎖以後,任何其他試圖再次對互斥鎖加鎖的執行緒將會阻塞直到當前執行緒釋放該互斥鎖。如果釋放互斥鎖時有多個執行緒阻塞,所有在該互斥鎖上的阻塞執行緒都會變成可執行...
Linux執行緒同步 細說 互斥鎖 條件變數
假設有多個執行緒共享的資源sum,與之相關聯的mutex 是lock s.假設每個執行緒對sum的操作很簡單,與sum的狀態無關,比如只是sum 那麼只用mutex足夠了.程式設計師只要確保每個執行緒操作前,取得lock,然後sum 再unlock即可.每個執行緒的對sum的操作 將像這樣 add ...
執行緒同步與互斥 條件變數
先上 include include include includepthread mutex t count lock pthread cond t count nonzero unsigned int count 0 pthread cond wait會把執行緒阻塞在這裡,同時釋放鎖 條件變數被...