C 多執行緒 生產者 消費者示例

2022-07-21 04:09:13 字數 1945 閱讀 6109

之前寫過一篇關於多執行緒的

為了複習一下c++多執行緒的使用,以及程式的編寫,於是寫了乙個生產者與消費者。

在編寫的過程中了解了條件變數(std::condition_variable)的使用,可以讓執行緒掛起和叫醒執行緒,以及之前編寫一些示例**的時候一直用的是std::locak_guard,而不是std::unique_lock,兩者都是raii(獲取資源立即初始化 ),而後者比較靈活,提供了lock(),unlock(),try_lock(),介面。

std::unique_lock的源**中大概是封裝了mutex的一些介面,下面從其他部落格複製了mutex的介面資訊。)

lock(),呼叫執行緒將鎖住該互斥量。執行緒呼叫該函式會發生下面 3 種情況:

(1). 如果該互斥量當前沒有被鎖住,則呼叫執行緒將該互斥量鎖住,直到呼叫 unlock之前,該執行緒一直擁有該鎖。

(2). 如果當前互斥量被其他執行緒鎖住,則當前的呼叫執行緒被阻塞住。

(3). 如果當前互斥量被當前呼叫執行緒鎖住,則會產生死鎖(deadlock)。

unlock(), 解鎖,釋放對互斥量的所有權。

try_lock(),嘗試鎖住互斥量,如果互斥量被其他執行緒占有,則當前執行緒也不會被阻塞。執行緒呼叫該函式也會出現下面 3 種情況:

(1). 如果當前互斥量沒有被其他執行緒占有,則該執行緒鎖住互斥量,直到該執行緒呼叫 unlock 釋放互斥量。

(2). 如果當前互斥量被其他執行緒鎖住,則當前呼叫執行緒返回 false,而並不會被阻塞掉。

(3). 如果當前互斥量被當前呼叫執行緒鎖住,則會產生死鎖(deadlock)。

下面**編寫中碰到的問題,在productitem與consumeitem的時候,都有對互斥量mtx上鎖的過程,在productitem的**裡有乙個sleep,是為了讓消費者能夠消費到商品,要不然就由於計算機速度太快,直接生產滿了,就碰到while(item…)直接出發is_full造成後面執行後生產者進入死鎖狀態。

當然,你可以編寫乙個對is_full這個條件變數相應的函式,比如item滿了就扔掉乙個,去解鎖is_full然後喚醒product執行緒,這樣就不需要sleep函式啦~

還有,可以用std::this_thread::yield()來實現把執行的執行緒時間片讓給其他執行緒使用,就比如item滿了之後讓其他執行緒執行,或者是std::this_thread::sleep_for() 讓執行緒睡一下,更或者直接sleep……hah….

**:#include

#include

#include

#include

#include

#include

class demo

item_id = item_id++ %buffsize;

item_buff.push(item_id);

cout << "product item id: " << item_id << endl;

lck.unlock();

is_empty.notify_all();

sleep(10);}}

void consumeitem()

cout << "customer id : " << this_thread::get_id() << endl;

cout << "consume item id: " << item_buff.front() << endl;

item_buff.pop();

lck.unlock();}}

public:

demo(int size = 10, int pno = 1, int cno = 5) :buffsize(size), p_no(pno), c_no(cno) {};

void run()

}void producttask()

}void customertask() }};

int demo::item_id = 0;

int main()

多執行緒 生產者消費者

這個就不多說了,直接上 include include using namespace std const unsigned short size of buffer 10 緩衝區長度 unsigned short productid 0 產品號 unsigned short consumeid 0...

Linux多執行緒 生產者消費者

生產者消費者問題 這是乙個非常經典的多執行緒題目,題目大意如下 有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,所有生產者和消費者都是非同步...

多執行緒 生產者消費者佇列

就以alibaba的筆試題舉例吧。題目大概的意思如下 有乙個籃子,最多容納5個蘋果。有人一直往裡放蘋果。有人一直去蘋果。寫出實現。ali要求不能用concurrent包裡面的東西,所以只能用最簡單的notify和wait。如果可以用concurrent包裡面的東西,還可以用blockingqueue...