多執行緒的同步與互斥機制(生產者 消費者模型)

2021-07-30 05:45:35 字數 3304 閱讀 2575

同步:所有執行緒以某種順序依次訪問臨界資源。

同步機制的實現:條件變數—–是利用執行緒間共享的全域性變數進行同步的機制。(乙個執行緒等待「條件變數的條件成立」而掛起;另乙個執行緒使「條件成立」(給出條件成立訊號)。為了防止競爭資源,條件變數總是和互斥鎖結合使用)

為什麼要實現同步機制呢?(為了防止競爭資源)

生產者消費者模型為例,首先我們需要了解什麼是生產者消費者模型:(三種關係、兩種角色、乙個交易場所)

生產者—–生產者(互斥關係)

生產者—–消費者(同步與互斥關係)

消費者—–消費者(互斥關係)

交易場所—–鍊錶

看下面的**:

在上面的**中生產者的優先順序低於消費者,導致消費者一直在獲得鎖讀取鍊錶的資料再釋放鎖,緊接著又獲得了鎖,使得生產者一直處於掛起狀態,而我們想要的是生產者生產乙個資料,消費者消費乙個資料。此時就需要引入同步機制(條件變數)使得消費者和生產者依次來訪問該鍊錶從而達到生產—消費平衡。

條件變數的建立:

靜態建立:pthread_cond_t cond = pthread_cond_initializer;

動態建立:int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);

引數1:條件變數cond的位址

引數2:條件變數cond的屬性,設定為null

等待:

int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);//在條件變數cond上阻塞式等待,這個函式做以下三步操作:

1. 釋放mutex

2. 阻塞等待

3. 當再次被喚醒時,自動獲得mutex

int pthread_cond_timedwait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);//條件變數cond上非阻塞式等待,引數3可以設定等待超時,如果到達了abstime所指定的時刻仍然沒有別的執行緒來喚醒當前執行緒,就返回etimedout。

喚醒:

int pthread_cond_signal(pthread_cond_t *cond)//喚醒在該cond上等待的另⼀個執行緒

int pthread_cond_broadcast(pthread_cond_t *cond)//喚醒在該cond上等待的所有執行緒

條件變數的銷毀:

int pthread_cond_destroy(pthread_cond_t *cond);

:沒有執行緒在該條件變數上等待時才可銷毀該條件變數。

看下面的**:

NSCondition 多執行緒解決生產者消費者問題

import viewcontroller.h inte ce viewcontroller 資料緩衝區 property strong,nonatomic nsmutablearray products 執行緒鎖 property strong,nonatomic nscondition cond...

執行緒 同步與互斥 消費者 生產者模型

執行緒互斥用互斥鎖,執行緒的同步則用到條件變數。條件變數是用來描述執行緒間同步的。下面以生產者 消費者為例 生產者和消費者之間存在同步與互斥的關係。生產者之間 消費者之間存在互斥的關係 include include includestatic int i 1 pthread mutex t loc...

執行緒的同步與互斥 生產者消費者模型

生產者與消費者模型 生產者與消費者模型是一種描述程序間同步與互斥的乙個方式,在這個模式下有兩類人,乙個是不停產生資料的生產者,乙個是不停獲取資料的消費者,為了效率最高,就必須保持兩者之間的同步與互斥。為了在生產者與消費者使用mutex保持互斥的前提下,posix版本下還有另外乙個函式cond它的作用...