当我们实现无锁数据结构时,为什么我们需要管理内存?考虑以下堆栈示例,为什么"删除old_head"正如书中所说,pop函数中的语句会给其他线程带来问题吗?我没有看到"取消引用悬空指针的机会"可能会发生,我会多次运行代码,而不会出现任何错误。
template<typename T>
class lock_free_stack
{
private:
struct node
{
std::shared_ptr<T> data;
node* next;
node(T const& data_) :
data(std::make_shared<T>(data_))
{}
};
std::atomic<node*> head;
public:
void push(T const& data)
{
node* const new_node = new node(data);
new_node->next = head.load();
while (!head.compare_exchange_weak(new_node->next, new_node));
}
std::shared_ptr<T> pop()
{
node* old_head = head.load();
while (old_head &&
!head.compare_exchange_weak(old_head, old_head->next));
auto res = old_head ? old_head->data : nullptr;
delete old_head;
return res;
}
};