最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)簡(jiǎn)單的生產(chǎn)者-消費(fèi)者隊(duì)列詳解

 更新時(shí)間:2023年04月28日 08:29:19   作者:二次元攻城獅  
這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的生產(chǎn)者-消費(fèi)者隊(duì)列,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

本文的代碼都是ChatGPT生成,我只是做了微小的調(diào)整和整合,AI提示詞如下:

設(shè)計(jì)一個(gè)C++類,支持生產(chǎn)者-消費(fèi)者模型,可以通過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)文章

最新評(píng)論

焦作市| 佛冈县| 库尔勒市| 曲靖市| 开封县| 富平县| 靖江市| 杭州市| 昆山市| 集贤县| 浮山县| 辉南县| 汾西县| 广平县| 镇原县| 黄陵县| 天水市| 林西县| 久治县| 宁夏| 拉萨市| 故城县| 乌什县| 广西| 栾城县| 固原市| 进贤县| 织金县| 涟水县| 甘谷县| 诸暨市| 若尔盖县| 太和县| 察隅县| 怀化市| 房产| 黑山县| 隆昌县| 淅川县| 繁昌县| 彭州市|