同步:所有執行緒以某種順序依次訪問臨界資源。
同步機制的實現:條件變數—–是利用執行緒間共享的全域性變數進行同步的機制。(乙個執行緒等待「條件變數的條件成立」而掛起;另乙個執行緒使「條件成立」(給出條件成立訊號)。為了防止競爭資源,條件變數總是和互斥鎖結合使用)
為什麼要實現同步機制呢?(為了防止競爭資源)
以生產者消費者模型為例,首先我們需要了解什麼是生產者消費者模型:(三種關係、兩種角色、乙個交易場所)
生產者—–生產者(互斥關係)
生產者—–消費者(同步與互斥關係)
消費者—–消費者(互斥關係)
交易場所—–鍊錶
看下面的**:
在上面的**中生產者的優先順序低於消費者,導致消費者一直在獲得鎖讀取鍊錶的資料再釋放鎖,緊接著又獲得了鎖,使得生產者一直處於掛起狀態,而我們想要的是生產者生產乙個資料,消費者消費乙個資料。此時就需要引入同步機制(條件變數)使得消費者和生產者依次來訪問該鍊錶從而達到生產—消費平衡。
條件變數的建立:
靜態建立: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它的作用...