我知道使用普通列表作为 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;
};