C++實(shí)現(xiàn)簡(jiǎn)單的生產(chǎn)者-消費(fèi)者隊(duì)列詳解
本文的代碼都是ChatGPT生成,我只是做了微小的調(diào)整和整合,AI提示詞如下:
設(shè)計(jì)一個(gè)C++類,支持生產(chǎn)者-消費(fèi)者模型,可以通過(guò)size函數(shù)獲取剩余數(shù)量
可能第一次生成的不一定合適,多刷新幾次。
生成的ProducerConsumerQueue.h代碼如下:
#ifndef PRODUCER_CONSUMER_QUEUE_H
#define PRODUCER_CONSUMER_QUEUE_H
#include <queue>
#include <mutex>
#include <condition_variable>
template<typename T>
class ProducerConsumerQueue {
public:
ProducerConsumerQueue(int size) : m_maxSize(size), m_curSize(0) {}
void push(T& val) {
std::unique_lock<std::mutex> lock(m_mutex);
while (m_curSize >= m_maxSize) {
m_notFull.wait(lock);
}
m_queue.push(val);
++m_curSize;
m_notEmpty.notify_one();
}
T pop() {
std::unique_lock<std::mutex> lock(m_mutex);
while (m_curSize <= 0) {
m_notEmpty.wait(lock);
}
T val = m_queue.front();
m_queue.pop();
--m_curSize;
m_notFull.notify_one();
return val;
}
int size() {
std::unique_lock<std::mutex> lock(m_mutex);
return m_curSize;
}
private:
std::queue<T> m_queue;
int m_maxSize;
int m_curSize;
std::mutex m_mutex;
std::condition_variable m_notEmpty;
std::condition_variable m_notFull;
};
#endif //PRODUCER_CONSUMER_QUEUE_H
在上面的代碼中,我們定義了一個(gè)ProducerConsumerQueue類:
- ProducerConsumerQueue類有最大容量和當(dāng)前容量?jī)蓚€(gè)屬性,使用std::queue<int>存儲(chǔ)數(shù)據(jù),使用std::mutex保證線程安全,使用std::condition_variable實(shí)現(xiàn)線程同步。
- 在push函數(shù)中,如果當(dāng)前容量已滿,等待消費(fèi)者消費(fèi);否則插入數(shù)據(jù),當(dāng)前容量加1,通知消費(fèi)者。
- 在pop函數(shù)中,如果當(dāng)前容量為0,等待生產(chǎn)者生產(chǎn);否則取出數(shù)據(jù),當(dāng)前容量減1,通知生產(chǎn)者。
- 在size函數(shù)中,使用std::unique_lockstd::mutex保證線程安全,獲取當(dāng)前容量并返回。
測(cè)試示例代碼如下:
#include <iostream>
#include "ProducerConsumerQueue.h"
int main() {
ProducerConsumerQueue<int> queue(2);
// 生產(chǎn)者線程
std::thread producer([&queue] {
for (int i = 0; i < 10; ++i) {
queue.push(i);
}
});
// 消費(fèi)者線程
std::thread consumer([&queue] {
for (int i = 0; i < 10; ++i) {
int value = queue.pop();
std::cout << "Consumed " << value << std::endl;
std::cout << queue.size() << std::endl;
}
});
producer.join();
consumer.join();
}到此這篇關(guān)于C++實(shí)現(xiàn)簡(jiǎn)單的生產(chǎn)者-消費(fèi)者隊(duì)列詳解的文章就介紹到這了,更多相關(guān)C++生產(chǎn)者消費(fèi)者隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(18.四數(shù)之和)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(18.四數(shù)之和),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲的示例代碼
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何實(shí)現(xiàn)經(jīng)典貪吃蛇游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01
使用UDP協(xié)議實(shí)現(xiàn)單詞翻譯服務(wù)器
這篇文章主要為大家詳細(xì)介紹了如何使用UDP協(xié)議實(shí)現(xiàn)英文單詞翻譯服務(wù)器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2023-08-08
C++實(shí)現(xiàn)校園導(dǎo)游系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)校園導(dǎo)游系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C++高性能服務(wù)器框架之協(xié)程調(diào)度模塊
這篇文章主要介紹了C++高性能服務(wù)器框架中的協(xié)程調(diào)度模塊,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-06-06
Qt中樹(shù)形控件Tree Widget的使用方法匯總
最近小編在研究Tree Widget樹(shù)形控件的相關(guān)知識(shí),這種控件其實(shí)有時(shí)還是很有用處的,我主要利用的是帶有復(fù)選框的樹(shù)形控件,下面通過(guò)實(shí)例代碼給大家介紹下Qt中樹(shù)形控件Tree Widget的一些使用方法,感興趣的朋友一起學(xué)習(xí)吧2021-11-11

