Hirdetés

Új hozzászólás Aktív témák

  • cog777

    senior tag

    Le tudna valaki csekkolni ezt a kodot? Tok mas teruleten dolgoztam mostanaban es radobbentem, hogy bizonytalan vagyok most ebben az alap kerdesben. Consumer-producer, thread safe circular buffer-rel + recursize mutex.

    Lefordul, mukodik crash nelkul, de kivancsi vagyok hogy elszabtam-e valamit... koszi elore is. :R

    Circular buffer kodja:
    circular_buffer.h

    #pragma once
    #include <array>
    #include <stddef.h>
    #include <mutex>

    template <typename T, size_t S>
    class circular_buffer
    {
    public:
    explicit circular_buffer() {}

    // Push an item to the tail
    bool push(const T &item)
    {
    std::lock_guard<std::recursive_mutex> lk(m);
    if (is_full())
    return false;
    buffer_[head_] = item;
    head_ = (head_ + 1) % buffer_.size();
    return true;
    }

    // Pop an item from the head
    bool pop(T &item)
    {
    std::lock_guard<std::recursive_mutex> lk(m);
    if (is_empty())
    return false;
    item = buffer_[tail_];
    tail_ = (tail_ + 1) % buffer_.size();
    return true;
    }

    // Check if the buffer is full
    bool is_full() const
    {
    std::lock_guard<std::recursive_mutex> lk(m);
    return (head_ + 1) % buffer_.size() == tail_;
    }

    // Check if the buffer is empty
    bool is_empty() const
    {
    std::lock_guard<std::recursive_mutex> lk(m);
    return head_ == tail_;
    }

    private:
    std::array<T, S> buffer_;
    size_t head_{0};
    size_t tail_{0};
    mutable std::recursive_mutex m;
    };

    main.cpp

    #include "circular_buffer.h"

    #include <iostream>
    #include <thread>
    #include <mutex>
    #include <condition_variable>

    circular_buffer<int, 5> buffer;

    std::mutex mtx; // Mutex for protecting shared data
    std::condition_variable empty, full; // Condition variables

    void producer(int loops)
    {
    for (int i = 0; i < loops; ++i)
    {
    std::unique_lock<std::mutex> lock(mtx);
    while (buffer.is_full())
    {
    empty.wait(lock); // Wait if buffer is full
    }
    buffer.push(i);
    full.notify_one(); // Signal that buffer is not empty
    std::cout << "Produced: " << i << std::endl;
    }
    }

    void consumer(int loops)
    {
    for (int i = 0; i < loops; ++i)
    {
    std::unique_lock<std::mutex> lock(mtx);
    while (buffer.is_empty())
    {
    full.wait(lock); // Wait if buffer is empty
    }
    int tmp;
    buffer.pop(tmp);
    empty.notify_one(); // Signal that buffer is not full
    std::cout << "Consumed: " << tmp << std::endl;
    }
    }

    int main()
    {
    int loops = 10;

    std::thread prodThread(producer, loops);
    std::thread consThread(consumer, loops);

    prodThread.join();
    consThread.join();

    return 0;
    }

Új hozzászólás Aktív témák