執行緒同步 條件變數

2021-06-09 11:58:20 字數 1566 閱讀 4905

當我們需要控制對記憶體資源的訪問的時候,可以用一種簡單的加鎖的方法來控制,即互斥鎖。但互斥鎖有乙個明顯的缺點,就是它只有兩個狀態:鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補來互斥鎖的不足。條件變數通常和互斥鎖一起使用。

【使用過程】

1.呼叫pthread_mutex_init()函式來初始化乙個pthread_t型別的互斥鎖

呼叫pthread_cond_init()函式來初始化乙個pthread_cond_t型別的條件變數

2.建立執行緒

3.乙個執行緒先呼叫pthread_mutex_lock()函式給互斥鎖上鎖,再呼叫無條件等待函式pthread_cond_wait()或者計時等待函式pthread_cond_timedwait()等待條件變數為真。呼叫此函式後,會先解鎖,阻塞等待到訊號後,再上鎖並繼續執行。此時再呼叫pthread_mutex_unlock()函式給互斥鎖解鎖。

4.另乙個執行緒呼叫pthread_cond_signal()函式喚醒對應條件變數的乙個執行緒(多個執行緒則按入隊順序喚醒),或者呼叫pthread_cond_broadcast()函式喚醒對應條件變數的所以執行緒。

【應用舉例】

描述:三個程序,乙個加加,乙個輸出偶數,乙個輸出奇數

#include #include #include pthread_cond_t cond;

pthread_mutex_t mutex1;

pthread_mutex_t mutex2;

int flag = 0;

int n;

/***********

*全域性變數n加1

***********/

void *number()

pthread_cond_signal(&cond); //傳送訊號 }}

/********

*輸出偶數

********/

void *even()

} pthread_mutex_unlock(&mutex1); }}

/********

*輸出奇數

********/

void *odd()

}pthread_mutex_unlock(&mutex2); }}

int main()

ret = pthread_create(&tid2, null, even, null);//建立執行緒2:輸出偶數

if (ret < 0)

ret = pthread_create(&tid3, null, odd, null); //建立執行緒3:輸出奇數

if (ret < 0)

pthread_join(tid1, null);

pthread_join(tid2, null);

pthread_join(tid3, null);

pthread_mutex_destroy(&mutex1);

pthread_mutex_destroy(&mutex2);

pthread_cond_destroy(&cond);

}

執行緒同步 條件變數

1.問題引入 互斥鎖問題,假設現在有兩個資源a和b,乙個執行緒先拿a再拿b,另乙個則相反,這樣導致的問題就是死鎖,即兩個執行緒無休止的互相等待 include include include include pthread mutex t g mtxa pthread mutex initializ...

執行緒同步 條件變數

多執行緒中條件變數的使用 執行緒同步之條件變數 include include include include include include include include using namespace std 乙個簡單的緩衝區類 struct buffer bool full return f...

執行緒同步 條件變數

條件變數本身不是鎖!但它也可以造成執行緒阻塞。通常與互斥鎖配合使用。給多執行緒提供乙個會合的場所。pthread cond init函式 pthread cond destroy函式 pthread cond wait函式 pthread cond timedwait函式 pthread cond ...