C ++ 11生産者 - 消費者モデルシミュレーション

#include <iostream>
#include <deque>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <thread>
#include <chrono>
#include <cstdlib>
#include <ctime>

template<typename T>
class Buffer
{
private:
    static const int SIZE = 10;
    std::deque<T> content;
    std::mutex mtx;
    std::condition_variable con_var;
public:
    Buffer() = default;
    void add(const T &item) {
        std::unique_lock<std::mutex> lck(mtx);
        con_var.wait(lck, [this](){return content.size() < SIZE;});
        content.push_back(item);
        con_var.notify_all();
    }

    T remove() {
        std::unique_lock<std::mutex> lck(mtx);
        con_var.wait(lck, [this](){return content.size() > 0;});
        T item = content.front();
        content.pop_front();
        con_var.notify_all();
        return item;
    }
};

template <typename T>
class Producer
{
private:
    Buffer<T> &buffer;
public:
    Producer(Buffer<T> &b) : buffer(b) {}
    void run(std::function<T()> produce) {
        while(true) {
            T item = produce();
            buffer.add(item);
            std::cout << "Produced " << item << std::endl;
        }
    }
};

template <typename T>
class Consumer
{
private:
    Buffer<T> &buffer;
public:
    Consumer(Buffer<T> &b) : buffer(b) {}
    void run(std::function<void(T &)> consume) {
        while(true) {
            T item = buffer.remove();
            consume(item);
            std::cout << "Consumed " << item << std::endl;
        }
    }
};

int main()
{
    Buffer<int> buffer;
    Producer<int> producer(buffer);
    Consumer<int> consumer(buffer);

    std::srand(std::time(nullptr));

    std::thread producer_thread(&Producer<int>::run, &producer, [](){
        std::this_thread::sleep_for(std::chrono::seconds(1 + std::rand() % 3));
        int item = std::rand() % 100;
        return item;
    });

    std::thread consumer_thread(&Consumer<int>::run, &consumer, [](int &x){
        std::this_thread::sleep_for(std::chrono::seconds(1 + std::rand() % 3));
    });

    producer_thread.join();
    consumer_thread.join();
}

おすすめ

転載: www.cnblogs.com/0x4863/p/11669424.html