0

我知道使用普通列表作为 spsc-queue 不是线程安全的。但我不知道为什么?如果我这样做会发生什么问题?我阅读了一篇关于 mpsc-queue 的论文,并对代码进行了一些更改。我将其更改为 spsc-queue。但我不知道我的 spsc_queue 是否是 thread_safe。

template <typename T>
class SPSCQueue
{
    struct Node
    {
        T *item = nullptr;
        Node *next = nullptr;
        bool is_sentinel;

        Node() : is_sentinel(true) {}
    };
public:
    SPSCQueue() 
    {
        m_head = new Node;
        m_tail = m_head;
    }

    ~SPSCQueue()
    {
        Node *tmp = m_head;
        while (m_head != nullptr)
        {
            temp = m_head;
            m_head = m_head->next;
            delete temp;
        }
    }

    void Enqueue(T *item)
    {
        if (item == nullptr) return;
        Node *last_tail = m_tail;
        m_tail = new Node();
        last_tail->item = item;
        last_tail->next = m_tail;
        last_tail->is_sentinel = false;
    }

    T *Dequeue()
    {
        if(m_head->is_sentinel) return nullptr;

        Node *last_head = m_head;
        T *item = last_head->item;
        m_head = last_head->next;
        delete last_head;
        return item;
    }

private:
    Node *m_head = nullptr;
    Node *m_tail = nullptr;
};
4

0 回答 0