Что произойдет, если использовать обычный список в качестве очереди spsc? - PullRequest
0 голосов
/ 05 ноября 2019

Я знаю, что использование потока в качестве spsc-очереди не безопасно. Но я не знаю почему? Что будет, если я сделаю это? Я прочитал статью о MPSC-очереди, и я делаю некоторые изменения в коде. Я изменяю это на spsc-очередь. Но я не знаю, является ли мой spsc_queue безопасным потоком.

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;
};
...