这个队列中的Node结构体是用来存储值和指向下一个节点的指针。如果不使用Node结构体,则需要通过其他方式来保存这些信息。
一种替代方式是使用std::pair
template
LockFreeQueue() : head_(nullptr), tail_(nullptr) {}
~LockFreeQueue()
{
while (head_)
{
Node *const old_head = head_;
head_ = head_->next;
delete old_head;
}
}
void push(const T &value)
{
Node *new_node = new Node(std::make_pair(value, nullptr));
if (!tail_)
{
head_ = new_node;
tail_ = head_;
}
else
{
tail_->next = new_node;
tail_ = new_node;
}
size_.fetch_add(1, std::memory_order_release);
}
bool try_pop(T &value)
{
Node *const old_head = head_;
if (!old_head)
{
return false;
}
Node *const new_head = old_head->next;
value = old_head->data.first;
head_ = new_head;
size_.fetch_sub(1, std::memory_order_release);
delete old_head;
return true;
}
bool empty() const
{
return size_.load(std::memory_order_acquire) == 0;
}
private:
typedef std::pair<T, Node*> value_type;
struct Node
{
value_type data;
Node *next;
Node() : next(nullptr) {}
explicit Node(const value_type &data_) : data(data_), next(nullptr) {}
};
Node *head_;
Node *tail_;
std::atomic<size_t> size_{0};
std::condition_variable cv_;
};