消費者與生產者由於存在於不同的執行緒,卻要訪問同一資源,所以容易訪問衝突。
三種關係實現安全訪問:
其中互斥量(mutex)實現互斥關係。互斥量是乙個標誌量,乙個執行緒對互斥量加鎖,其他執行緒在對其加鎖時就會阻塞從而實現互斥。
條件變數實現同步,但要借助互斥量。當阻塞條件滿足時,條件變數阻塞當前執行緒,並解鎖互斥量,目的是讓其他執行緒獲得互斥量,操作公共資源。 另一方面,當前執行緒不阻塞,操作完公共資源後靠條件變數通知其他執行緒,解除其他執行緒的阻塞狀態。
c++對互斥量的加鎖解鎖實現了兩種介面:unique_lock, lock_guard。lock_guard建立時加鎖,離開作用域解鎖,也就意味著整個函式體都處於單執行緒下。unique_lock能隨時加鎖解鎖,在訪問公共資源時加鎖保證單執行緒訪問,執行緒獨有的操作時解鎖,允許其他執行緒執行,提高並發行。
生產消費者模型
#include
#include
#include
#include
#include
using namespace std;
const
int arr_size =
2048
;struct circlequeue
} g_circlequeue;
void
produceitem
(circlequeue &qu,
int item)
//佇列不滿,執行生產操作。
qu.arr[qu.write_pos]
= item;
qu.write_pos =
(qu.write_pos +1)
% arr_size;
//通知因佇列空而阻塞的消費者執行緒。
qu.cond_not_empty.
notify_all()
; lock.
unlock()
;}void
consumitem
(circlequeue &qu,
int& item)
//佇列不空,執行消費操作
item = qu.arr[qu.read_pos]
; qu.read_pos =
(qu.read_pos +1)
% arr_size;
qu.cond_not_full.
notify_all()
; lock.
unlock()
;}//每個生產線程生產3個產品
void
producetask()
}void
consumtask()
}int
main()
在判斷阻塞條件時要使用while而不是if,原因是避免虛假喚醒,當多個生產者或多個消費者等在wait條件不能同時喚醒。
看到一些部落格說,這種模型容易引發死鎖,不知到什麼情況會引發死鎖,以及如何解決呢?有人能說一下嗎?
互斥訊號量wait應該放在資源訊號量後面,過幾天再改。
參考:
生產者消費者問題之多生產者 單消費者模型
與單生產者和單消費者模型不同的是,多生產者 單消費者模型中可以允許多個生產者同時向產品庫中放入產品。所以除了保護產品庫在多個讀寫執行緒下互斥之外,還需要維護生產者放入產品的計數器,如下 include include include include include static const int ...
生產者 消費者問題模型
一 模型簡介 生產者消費者模式就是通過乙個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞佇列來進行通訊,所以生產者生產完資料之後不用等待消費者處理,直接扔給阻塞佇列,消費者不找生產者要資料,而是直接從阻塞佇列裡取,阻塞佇列就相當於乙個緩衝區,平衡了生產者和消費者的...
生產者消費者模型
1.生產者消費者問題 producer consumer 有限緩衝,多執行緒同步。生產者執行緒和消費者執行緒共享固定大小緩衝區。2.關鍵是保證生產者不會再緩衝區滿時加入資料,消費者不會在緩衝區空時消耗資料。3.解決辦法 讓生產者在緩衝區滿時休眠,等下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒...