以下是优化后的代码:
#include
template
while (Node *old_head = head_.load()) {
Node *next = old_head->next_;
if (head_.compare_exchange_weak(old_head, next)) {
delete old_head;
break;
}
}
}
void push(const T &value) {
auto new_node = std::make_unique<Node>(value);
auto *new_node_ptr = new_node.get();
Node *tail = tail_.load(std::memory_order_relaxed);
while (true) {
auto *next = tail->next_.load(std::memory_order_acquire);
if (!next) {
if (tail->next_.compare_exchange_weak(next, new_node_ptr,
std::memory_order_release,
std::memory_order_relaxed)) {
break;
}
} else {
tail_.compare_exchange_weak(tail, next, std::memory_order_release,
std::memory_order_relaxed);
}
}
tail_.compare_exchange_weak(tail, new_node_ptr, std::memory_order_release);
size_.fetch_add(1, std::memory_order_release);
}
bool try_pop(T &value) {
Node *old_head = head_.load(std::memory_order_relaxed);
while (true) {
auto *new_head = old_head->next_.load(std::memory_order_acquire);
if (!new_head) {
return false;
}
if (head_.compare_exchange_weak(old_head, new_head,
std::memory_order_release,
std::memory_order_relaxed)) {
value = std::move(new_head->value_);
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: struct Node {
T value_;
std::atomic<Node *> next_{nullptr};
explicit Node(const T &value) : value_(value) {}
};
std::atomic
优化点:
1.使用std::make_unique构造节点对象,避免手动new和delete
2.在try_pop中使用while循环重试,避免竞争条件(多个线程同时pop)时出现问题