一、實現線程間同步互斥的操作
1、線程間同步 ==== 有序執行法1、多個信號量 法2、條件變量+互斥鎖 ===>broadcast signal
2、線程間互斥 ==== "你死我活"法1、單個信號量 法2、互斥鎖
//1、互斥是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。//2、同步是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。//3、同步其實已經實現了互斥,所以同步是一種更為複雜的互斥。//4、互斥是一種特殊的同步。
二、為什麼要實現同步互斥
保護臨界資源
即全局變量
pthread_create之前的成為 全局資源 =====>當有線程操作全局資源的時候 ===>變為臨界資源
三、代碼示例
1、多個線程實現同步,定義多個信號量
同步是在互斥的基礎上實現有序。
2、互斥鎖實現線程互斥
同步是在互斥的基礎上實現有序。
互斥是一種特殊的同步
3、互斥鎖 + 條件變量 實現同步互斥
1)mutex + pthread_cond + pthread_cond_broadcast
//pthread_cond_wait() 用於阻塞當前線程,等待別的線程使用pthread_cond_signal()或pthread_cond_broadcast來喚醒它。 //pthread_cond_wait() 必須與pthread_mutex 配套使用。pthread_cond_wait()函數一進入wait狀態就會自動release mutex。//當其他線程通過pthread_cond_signal()或pthread_cond_broadcast,把該線程喚醒,使pthread_cond_wait()通過(返回)時,該線程又自動獲得該mutex。
當有多個線程時,使用pthread_cond_broadcast會喚醒所有阻塞的線程,因此不能高效保證其同步性。
2)mutex + pthread_cond + pthread_cond_signal
//pthread_cond_signal函數的作用是發送一個信號給另外一個正在處於阻塞等待狀態的線程,使其脫離阻塞狀,繼續執行//.如果沒有線程處在阻塞等待狀,pthread_cond_signal也會成功返回。//pthread_cond_signal只給一個線程發信號。//假如有多個線程正在阻塞等待著這個條件變量的話,那麼是根據各等待線程優先級的高低確定哪個線程接收到信號開始繼續執行。//如果各線程優先級相同,則根據等待時間的長短來確定哪個線程獲得信號。
先將pthread_cond_signal注釋掉,看看會有什麼現象
兩個線程都發送阻塞進入了睡眠,
疑問:創建線程時,線程運行進入阻塞,為什麼代碼能接著運行,而不是阻塞在阻塞處,不像下執行。
原因:在線程進入阻塞後,會自動釋放CPU控制權,進入阻塞。只有當中斷發生時,才會使線程從阻塞中跳出,即pthread_cond_signal喚醒阻塞線程
使用pthread_cond_signal喚醒指定的條件阻塞線程