結果分析
原始碼位址
首先,我們的生產者與消費者佇列需要滿足同步與互斥關係,就需要一把互斥鎖,以及生產者與消費者各自的條件變數。
其次,我們可以利用c++中stl裡的queue
佇列來進行實現,但是我們需要對push,pop進行修改,因為stl庫的函式不一定能滿足互斥條件。也就是不一定安全。
最後,所有資源在程式結束後一定要記得釋放,否則會出現記憶體洩漏的風險。
/thread safe queue
class
blockqueue
//push == producer
void
push
(int
& data)
_queue.
push
(data)
;pthread_mutex_unlock
(&_lock)
;pthread_cond_signal
(&_consumecond);}
//pop == consumer
void
pop(
int* data)
*data = _queue.
front()
; _queue.
pop();
pthread_mutex_unlock
(&_lock)
;pthread_cond_signal
(&_productcond);}
~blockqueue()
private
:bool
isfull()
private
: queue<
int> _queue;
size_t _capacity;
// queue max capacity
//互斥
pthread_mutex_t _lock;
//mutex
//同步
pthread_cond_t _consumecond;
// consume cond
pthread_cond_t _productcond;
// product _productcond
};
void
*producter_start
(void
* arg)
return
null
;}
void
*consumer_start
(void
* arg)
return
null
;}
int
main()
ret =
pthread_create
(&pro_tid[i]
,null
,producter_start,
(void
*)que);if
(ret <0)
}//thread wait
for(
int i =
0; i < threadcount; i++
)//防止記憶體洩漏
我們發現最後的結果中,有一部分生產者與消費者資訊的列印好像不是那麼規範,但實際上他們都是合理的訪問臨界資源的。
因為執行緒之間的搶占式執行,使得每乙個執行緒只能擁有乙個cpu資源一小會,然後就需要讓出cpu資源給其他執行緒。然後就會出現上圖所示的執行邏輯。
佇列,生產者消費者模型
from multiprocessing import process,lock import os,time,json with open user w encoding utf 8 as f dic json.dump dic,f def search with open user r enco...
生產者消費者 生產者與消費者模式
一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...
生產者消費者
using system using system.collections.generic using system.threading namespace gmservice foreach thread thread in producers q.exit console.read public...