C 實現生產者消費者佇列

2021-10-05 05:07:02 字數 1915 閱讀 6077

結果分析

原始碼位址

首先,我們的生產者與消費者佇列需要滿足同步與互斥關係,就需要一把互斥鎖,以及生產者與消費者各自的條件變數。

其次,我們可以利用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...