Я знаю, что использование потока в качестве 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;
};