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

  • cog777

    őstag

    Masik kerdes.
    Adja magat egy thread es egy nem thread safe verzioja a circual_buffer-nek.
    Forditasi idoben meg tudom mondani hogy a mutex-es sorok letiltodjanak vagy engedelyezve legyenek template-et hasznalva?

    Valami ilyesmire gondoltam, ugyanakkor forditasi hibaim vannak:

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

    enum class THREAD_SAFETY
    {
    THREAD_SAFE = 0,
    NOT_THREAD_SAFE
    };

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

    // Push an item to the tail
    bool push(const T &item)
    {
    if constexpr (std::is_same<TH, THREAD_SAFETY::THREAD_SAFE>::value)
    {
    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)
    {
    if constexpr (std::is_same<TH, THREAD_SAFETY::THREAD_SAFE>::value)
    {
    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
    {
    if constexpr (std::is_same<TH, THREAD_SAFETY::THREAD_SAFE>::value)
    {
    std::lock_guard<std::recursive_mutex> lk(m);
    }
    return (head_ + 1) % buffer_.size() == tail_;
    }

    // Check if the buffer is empty
    bool is_empty() const
    {
    if constexpr (std::is_same<TH, THREAD_SAFETY::THREAD_SAFE>::value)
    {
    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};
    if constexpr (std::is_same<TH, THREAD_SAFETY::THREAD_SAFE>::value)
    {
    mutable std::recursive_mutex m;
    }
    };

    main.cpp-ben:

    circular_buffer<int, 5, THREAD_SAFETY::THREAD_SAFE> buffer;

    De sajnos hibakat ir ki:

    /home/zoltan/dev/learning/CPP/algorithms/producer-consumer/circular_buffer.h:70:5: error: expected unqualified-id before ‘if’
    70 | if constexpr (std::is_same<TH, THREAD_SAFETY::THREAD_SAFE>::value)
    | ^~
    /home/zoltan/dev/learning/CPP/algorithms/producer-consumer/circular_buffer.h: In member function ‘bool circular_buffer<T, S, TH>::push(const T&)’:
    /home/zoltan/dev/learning/CPP/algorithms/producer-consumer/circular_buffer.h:21:66: error: type/value mismatch at argument 1 in template parameter list for ‘template<class, class> struct std::is_same’
    21 | if constexpr (std::is_same<TH, THREAD_SAFETY::THREAD_SAFE>::value)

    Masreszt nem vagyok biztos hogy a constexpr if-ek valodi blokkent mukodnek, tehat a lock_guard mukodni fog-e...

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