Linux同步技術之條件變數

2021-07-12 02:07:29 字數 2053 閱讀 2076

條件變數也是linux中的一種同步技術,不過其一般不單獨使用而是要和互斥鎖一起配合使用。

如果單獨使用互斥量的話,很容易發生死鎖,所以條件變數為次應運而生^_^ !

條件變數允許乙個執行緒阻塞和等待另乙個執行緒傳送的訊號,使用條件變數可以以原子的方式阻塞執行緒,直到滿足某個條件為止,可以避免忙等。

條件變數通常和互斥鎖一起使用,互斥量主要用來保證對臨界區的互斥進入,而條件變數則用於執行緒的阻塞等待,互斥鎖鎖定進入臨界區以後,若條件不滿足,執行緒就轉為等待狀態,等待條件滿足後再被喚醒執行,否則繼續執行,執行完成後解鎖。

條件變數的型別:pthread_cond_t

條件變數的相關函式:

int pthread_cond_wait(pthread_cond_t *restrict cond,

pthread_mutex_t *restrict mutex);

該函式是條件變數的等待函式,等待條件為真時喚醒相應的等待執行緒。

該函式在執行的時候可看成是執行了兩個過程:(1)阻塞呼叫執行緒;(2)對互斥量進行解鎖操作。但是其內部實現其實是先解鎖互斥量然後再呼叫某個函式進行阻塞等待。當其等待條件變為真時,其先進行互斥量的加鎖操作之後執行相應的操作。

int pthread_cond_broadcast(pthread_cond_t *cond);

該函式的作用就是當條件cond變為真時,給等待該條件變為真的所有執行緒以廣播的方式傳送訊號。之後所有等待該條件的執行緒都被喚醒。

int pthread_cond_signal(pthread_cond_t *cond);

該函式的作用就是當條件cond為真時,給等待該條件變為真的執行緒傳送訊號,但是最終只能有乙個執行緒被喚醒去執行相應的程式。

條件變數的初始化和銷毀函式:

int pthread_cond_destroy(pthread_cond_t *cond);

條件變數的摧毀函式,當條件變數使用完成後摧毀該條件變數。

int pthread_cond_init(pthread_cond_t *restrict cond,

const pthread_condattr_t *restrict attr);

該函式是條件變數的初始化函式,cond引數是條件變數,attr是該條件的屬性,該屬性可以用屬性的初始化函式初始化,也可以使用其預設屬性。

pthread_cond_t cond = pthread_cond_initializer該方式是將條件變數初始化為乙個常值。

以上所提到的所有函式如果執行成功,返回0,失敗就返回錯誤編號。

以下是乙個使用互斥量和條件變數的進行同步的生產者消費者程式

#include #include #include #define buffer_size 6

#define max_size 50

structshared = ;

//生產者程式

void *produce(void *arg)

if(shared.count < buffer_size)

shared.nval++; //生產者產生的資料值增加

shared.count++; //生產者產生的資料個數增加

pthread_cond_signal(&shared.noempty); //給消費者執行緒傳送訊號,告訴消費者執行緒緩衝區中有資料可讀

}else

pthread_mutex_unlock(&shared.mutex); //解鎖互斥量

}}//消費者程式

void *consume(void *arg)

shared.count--; //緩衝區中的元素個數減一

pthread_cond_signal(&shared.nofull); //給生產者執行緒傳送訊號,告訴生產者執行緒緩衝區不滿,可以存入資料

i++; //計數器,用來計數該讀出的資料的個數

}else

pthread_mutex_unlock(&shared.mutex); //解鎖互斥鎖

}}int main()

Linux執行緒同步之條件變數

與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙...

Linux執行緒同步之 條件變數

條件變數是執行緒可用的另一種同步機制。條件變數給多執行緒提供了乙個會合的場所。它主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙個執行緒使 條件成立 給出條件成立訊號 條件變數與互斥量一起使用時,允許執行緒以無競爭的方式等待特定的條件發生。條件變數本身是互斥量保護的。執行緒在改變條...

Linux執行緒同步之條件變數

條件變數變數也是出自posix 執行緒標準,另一種執行緒同步機制,主要用來等待某個條件的發生。可以用來同步同一程序中的各個執行緒。當然如果乙個條件變數存放在多個程序共享的某個記憶體區中,那麼還可以通過條件變數來進行程序間的同步。每個條件變數總是和乙個互斥量相關聯,條件本身是由互斥量保護的,執行緒在改...