單生產者 單消費者模型 產品庫位於執行緒函式外

2021-10-20 07:38:22 字數 3628 閱讀 7760

c++ 11 多線執行緒系列-----------生產者消費者

c11執行緒管理:互斥鎖

2023年2月25日12點35分

我傻了,我何必把產品庫的指標傳來傳去,存來訪問呢,寫成全域性得了。若要封裝,可以寫友元類。

需要構成乙個生產者消費者模式,生產者和消費者是無繼承關係的兩個類的各自的物件,作用與兩個不同的執行緒中。產品庫設計在兩個執行緒之外。

#include

std::mutex g_lock;

提供乙個鎖,其實也考慮過critical_section,其開銷較mutex更低,但是下面的方法

#include

std::condition_variable not_empty;

需要配合mutex使用,具體方法為

std::unique_lock

lck(g_lock)

;not_empty.

wait

(lck)

;// 掛起當前執行緒..

.not_empty.

notify_all()

;// 釋放

由於g_locknot_empty是全域性變數,可以在另一線程中為被掛起的當前執行緒進行釋放

還有一點,unique_lock的使用可以省去lock()unlock()語句的繁瑣,提公升了安全性又不失自由度。(預設在作用域生命週期結束時解鎖)。

#include

#include

#include

#include

#include

#include

std::mutex g_lock;

// 互斥

std::condition_variable not_empty;

// 掛起條件

class

c****

void

make****()

private

:void

show****poolsize()

};class

ceat

void

eat****()

std::cout <<

"eating ****:"

<< std::this_thread::

get_id()

<< std::endl;

std::this_thread::

sleep_for

(std::chrono::

seconds

(eattime));

(*****pool)

.pop()

; std::cout <<

"**** eaten:"

<< std::this_thread::

get_id()

<< std::endl;

show****poolsize()

;}private

:void

show****poolsize()

};void

vfunc1

(std::queue<

char

>

* sp)

}void

vfunc2

(std::queue<

char

>

* sp)

}int

main()

std::thread t1

(vfunc1,

&****pool)

; std::thread t2

(vfunc2,

&****pool)

; t1.

join()

; t2.

join()

;return0;

}

eating ****:4776

**** eaten:4776

**** pool size: 2

eating ****:4776

**** eaten:4776

**** pool size: 1

****** ****:16284

**** made:16284

**** pool size: 2

****** ****:16284

**** made:16284

**** pool size: 3

****** ****:16284

**** made:16284

**** pool size: 4

eating ****:4776

**** eaten:4776

**** pool size: 3

eating ****:4776

**** eaten:4776

**** pool size: 2

eating ****:4776

**** eaten:4776

**** pool size: 1

eating ****:4776

**** eaten:4776

**** pool size: 0

i'm hungry!!

****** ****:16284

**** made:16284

**** pool size: 1

****** ****:16284

**** made:16284

**** pool size: 2

****** ****:16284

**** made:16284

**** pool size: 3

****** ****:16284

**** made:16284

**** pool size: 4

****** ****:16284

**** made:16284

**** pool size: 5

****** ****:16284

**** made:16284

**** pool size: 6

****** ****:16284

**** made:16284

**** pool size: 7

eating ****:4776

**** eaten:4776

**** pool size: 6

eating ****:4776

**** eaten:4776

**** pool size: 5

eating ****:4776

**** eaten:4776

**** pool size: 4

eating ****:4776

**** eaten:4776

**** pool size: 3

i'm hungry!!提示消費者執行緒被掛起。執行緒之間的運轉由cpu的scheduler分配,可視為隨機。

單生產者,單消費者

單個生產者和單個消費者 include include include include include include define buffer size 5 產品庫存大小 define product cnt 50 產品生產總數 struct product cons buffer void i...

單生產者 單消費者

父親生產蘋果,女兒消費蘋果,當盤子中沒有蘋果的時候父親生產,女兒只能等待,當盤子中有蘋果的還是父親等待女兒消費 package com.cc.day16 public class demo01 定義乙個類,描述消費的產品 定義公共的變數 public string name public int c...

生產者消費者問題之多生產者 單消費者模型

與單生產者和單消費者模型不同的是,多生產者 單消費者模型中可以允許多個生產者同時向產品庫中放入產品。所以除了保護產品庫在多個讀寫執行緒下互斥之外,還需要維護生產者放入產品的計數器,如下 include include include include include static const int ...