Untitled

 avatar
unknown
c_cpp
a month ago
1.5 kB
2
Indexable
#include <iostream>
#include <thread>
#include <condition_variable>
#include <queue>
#include <cstdlib>
#include <chrono>

using namespace std;

#define BUFFER_SIZE 10

queue<int> buffer;
mutex mtx;
condition_variable cv_empty;
condition_variable cv_full;

int produced_count = 0;
int consumed_count = 0;
int total_items = 0;

void producer() {
    while (produced_count < total_items) {
        int item = rand() % 100;

        this_thread::sleep_for(chrono::seconds(1));

        unique_lock<mutex> lock(mtx);

        cv_empty.wait(lock, []() { return buffer.size() < BUFFER_SIZE; });

        buffer.push(item);
        produced_count++;
        cout << "Produced: " << item << endl;

        cv_full.notify_one();
    }
}

void consumer() {
    while (consumed_count < total_items) {
        this_thread::sleep_for(chrono::seconds(1));

        unique_lock<mutex> lock(mtx);

        cv_full.wait(lock, []() { return !buffer.empty(); });

        int item = buffer.front();
        buffer.pop();
        consumed_count++;
        cout << "Consumed: " << item << endl;

        cv_empty.notify_one();
    }
}

int main() {
    cout << "Enter the total number of items to produce and consume: ";
    cin >> total_items;

    thread prod_thread(producer);
    thread cons_thread(consumer);

    prod_thread.join();
    cons_thread.join();

    cout << "All items have been produced and consumed." << endl;

    return 0;
}
Leave a Comment