互斥鎖和條件變數

2021-07-14 10:12:12 字數 1012 閱讀 5818

互斥瑣

定義:指代相互排斥,最基本的同步形式。用於保護臨界區,以保證任何時刻只有乙個執行緒或乙個程序在執行其中的**。

上鎖:pthread_mutex_lock()

臨界區解鎖:pthread_mutex_unlock();

條件變數

定義:用於等待訊號,同步的另一種手段。每乙個條件變數總有乙個互斥瑣與之關聯。

等待函式:pthread_cond_wait();

訊號傳送函式:pthread_cond_signal();

生產者和消費者的問題:生產者向buf新增資料,新增到 m 個,消費者讀資料,讀到 i 個;

1.如果只用互斥瑣解決,消費者讀的每乙個i  資料,都必須先上鎖 m ,然後查詢 i < m ? 然後解鎖,如果不小於,則接著上鎖——查詢——解鎖,需要輪詢,這將非常消耗cpu。

2.互斥瑣+條件變數完美解決這個問題:互斥瑣用於上鎖,條件變數用於等待,生產者流程 上鎖——生產資料——解鎖,上鎖——改變條件,發訊號——解鎖。(條件用來通知消費者資料準備好,為避免上鎖衝突,需要先改變條件再發訊號)。消費者流程 上鎖——等待條件,改變條件——解鎖。

附加:讀寫鎖

同步一些執行緒共享的乙個或多個資料的訪問或更新。

屬性:只要沒有執行緒持有某個給定的讀寫鎖用於寫,那麼任意數目的執行緒可以持有該讀寫鎖用於讀。

僅當沒有執行緒持有某個給定的讀寫鎖用於讀或寫時,才能分配該讀寫鎖用於寫。

pthread_rwlock_wrlock();//獲取乙個寫入鎖;

pthread_rwlock_unlock();//釋放乙個讀出鎖或寫入鎖;

記錄上鎖:讀寫鎖的一種擴充套件型別,可用於有親緣關係或無親緣關係的程序之間共享某個檔案的讀和寫。被鎖住的檔案通過其描述符訪問,執行上鎖操作的函式是fcntl.這種鎖通常在核心中維護,屬主是由屬主的程序id標識的。

互斥鎖和條件變數

mutex體現的是一種競爭,我離開了,通知你進來。cond體現的是一種協作,我準備好了,通知你開始吧。互斥鎖乙個明顯的缺點是它只有兩種狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補了互斥鎖的不足,它常和互斥鎖一起配合使用。使用時,條件變數被用來阻塞乙個執行緒,當...

互斥鎖和條件變數

條件變數 執行緒最大的特點就是資源的共享性,然而資源共享中的同步問題是多執行緒程式設計的難點。互斥鎖通過鎖機制來實現執行緒間的同步。使用互斥鎖前必須進行初始化操作。初始化有兩種方式 一種是靜態賦值法,將將巨集結構常量pthread mutex initializer賦給互斥鎖,操作語句如下 pthr...

互斥鎖和條件變數

一直以來都理解錯了,不是使用條件變數再加上一對互斥鎖,而是條件變數內部引入乙個互斥鎖,其實主要還是條件變數在起作用,這樣會提高效率,看下面的例子。while true thread 2 while true pthread mutex unlock mutex 這種實現下,就算 lock 空閒,th...