條件變數
使用互斥鎖可以解決執行緒安全的問題,保證多執行緒下臨界資源資料的正確性.
但是僅僅互斥還是會存在一些問題.
條件變數:
以打球舉例:a負責傳球,b負責投籃,當b想要投籃的時候哦,但是發現a並沒就將球傳給自己之前,就不能去投籃,只能等待a將球傳給自己才可以繼續執行自己的投籃任務
條件變數函式
初始化
int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);
引數:
cond:要初始化的條件變數
attr:null
銷毀
int pthread_cond_destroy(pthread_cond_t *cond);
等待條件滿足
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
引數:
cond:要在這個條件變數上等待
mutex:互斥量
喚醒等待
int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);
**舉例:(以打球為例)
#include
#include
#include
#include
pthread_cond_t g_shot;
pthread_mutex_t g_lock;
void* pass(void* arg)
return null;
} void* shot(void* arg)
return null;
} int main()
未加條件變數的執行結果:
因為我們設定的是傳球比較慢一些,投籃比較快一些,可以看到,在"投籃"一直在執行,消耗著資源
加了條件變數的執行結果:
我們可以看到,傳球和投籃一定是交替執行的,在傳球結束以後會傳送乙個訊號,"投籃"發現條件滿足了就會開始投籃,在這之前一直等待
為什麼 pthread_cond_wait 需要互斥量?
條件變數是為了解決某些情況下互斥鎖低效的問題. 因此對條件變數的操作, 必然要和互斥鎖密切相關.
觀察一下的**看看有什麼問題?
pthread_mutex_lock(&mutex);
while(條件為假)
pthread_mutex_unlock(&mutex);
我們分析以上的**,可能會出現如下問題:
wait函式中的互斥量進入函式以後,回去檢視當前的條件是不是為假,如果是假,就將互斥量置為1,知道 wait 返回,把條件改為1,將互斥量置為原來的樣子,保證wait不錯過訊號量,避免阻塞.
條件變數使用規範
pthread_mutex_lock(&mutex);
while(條件為假)
pthread_cond_wait(cond,mutex);
修改條件
pthread_mutex_unlock(&mutex);
pthread_mutex_lock(&mutex);
設定條件為真
pthread_cond_signal(cond);
pthread_mutex_unlock(&mutex);
linux 執行緒 執行緒同步
因為執行緒獨自擁有的只有棧,其他的區域執行緒共同擁有。並且對共享區域的操作並不都是原子的。對共享區域的操作順序又是不確定的。就像建立兩個檔案描述符同時指向 同一檔案,並且連續向檔案中寫入那麼寫的東西可能是亂七八糟的。這時就需要執行緒對共享區的同步。而另一種情況是,多個執行緒的指令執行順序需要同步。這...
Linux執行緒同步
1.概要 執行緒的同步,發生在多個執行緒共享相同記憶體的時候,這時,要保證每個執行緒在每個時刻看到的共享資料是一致的。如果每個執行緒使用的變數都是其他執行緒不會使用的 read write 或者變數是唯讀的,就不存在一致性問題。但是,如果兩個或兩個以上的執行緒可以read write乙個變數時,就需...
Linux執行緒同步
1.概要 執行緒的同步,發生在多個執行緒共享相同記憶體的時候,這時,要保證每個執行緒在每個時刻看到的共享資料是一致的。如果每個執行緒使用的變數都是其他執行緒不會使用的 read write 或者變數是唯讀的,就不存在一致性問題。但是,如果兩個或兩個以上的執行緒可以read write乙個變數時,就需...