我目前正在使用C++11开发无锁单向链表,并且我在
无论如何,这是我目前的代码:
请注意,
然而,我预计会遇到一些问题。首先是当两个线程执行
这个链表的想法是让它无锁,所以我想避免在这个函数中使用锁。不幸的是,我不知道如何解决这些问题。任何建议将不胜感激。
popFront()
函数中遇到了问题,或者至少我知道它在某些情况下会出现问题。无论如何,这是我目前的代码:
std::shared_ptr<T> popFront(void)
{
auto p = atomic_load(&head);
while(p && !atomic_compare_exchange_weak(&head, &p, p->next))
{}
return p ? p->data : std::shared_ptr<T>();
}
请注意,
head
的类型是shared_ptr
。然而,我预计会遇到一些问题。首先是当两个线程执行
popFront()
时,它们都读取相同的head
,并且一个线程先完成。在第二个线程完成之前,调用者删除了指向的对象,因此第二个线程现在正在处理已删除的内存。第二个问题是经典的ABA问题。这个链表的想法是让它无锁,所以我想避免在这个函数中使用锁。不幸的是,我不知道如何解决这些问题。任何建议将不胜感激。