Linux 執行緒同步

2021-08-20 23:53:14 字數 2107 閱讀 1588

條件變數

使用互斥鎖可以解決執行緒安全的問題,保證多執行緒下臨界資源資料的正確性.

但是僅僅互斥還是會存在一些問題.

條件變數:

以打球舉例: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乙個變數時,就需...