可以使用无锁算法中的原子操作,例如std::atomic
可以将Node *类型的tail变量声明为std::atomic
下面是修改后的代码示例:
void push(const T &value)
{
Node *new_node = static_cast<Node *>(memory_pool_.Alloc(sizeof(Node)));
if (new_node == nullptr)
{
printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
return;
}
new (new_node) Node(std::make_pair(value, nullptr));
Node *tail = tail_.load(std::memory_order_relaxed);
while(true){
Node* next = tail->value_.second;
if(tail_.compare_exchange_weak(tail,next)){
tail->value_.second = new_node;
size_.fetch_add(1, std::memory_order_release);
break;
}
}
}
这里我们采用了自旋锁的方式进行CAS操作,如果成功则退出循环,否则继续尝试。这样就避免了对队列的锁定,提高了性能。