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_lock
和not_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 ...