单插入多读取列表是否安全无锁?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单插入多读取列表是否安全无锁?相关的知识,希望对你有一定的参考价值。

关于线程之间的同步我有一个问题。我知道正常的同步方法和无锁列表。但我有一个奇怪的(也许)想法。

我有一个正常的C语言单列表,由next指针链接。

只有一个线程只是将项目插入此列表,但从不删除项目。添加项目的方式:

new_item->next = list_head;
list_head = new_item;

还有一些其他线程只是遍历此列表(只读)。

根本没有锁。

我认为这应该是安全的,因为只读线程永远不会得到无效的指针。我对吗?

我不知道如何在互联网上搜索这个。我得到的是CAS或其他什么的无锁列表。所以我在这里问。

提前致谢

答案

您没有指定语言和数据类型,但通常可能是数据争用(C ++中的未定义行为),因为一个线程可能会修改list_head,而其他线程可能同时读取它。

如果这些读/写是原子的,那么就没有数据竞争。据我所知,在x86架构上,读取和写入是自动原子的。但这可能不适用于其他架构。

此外,重新排序问题可能会破坏这里的内容,这就是内存栅栏的用途,这些内容通常由编译器在涉及(顺序一致的)原子操作时生成。更新2个指针的值,例如,在C ++中放宽内存排序,允许线程以不同的顺序“看到”这些更新(通常由于编译器优化,乱序执行,CPU存储缓冲区等)。 )。有关详细信息,请参阅http://en.cppreference.com/w/cpp/atomic/memory_order

在C ++ 11中,您需要使用std::atomic来确保list_head上的原子操作。使用OpenMP,有#pragma atomic read/write (seq_cst)指令。

以上是关于单插入多读取列表是否安全无锁?的主要内容,如果未能解决你的问题,请参考以下文章

CAS 无锁队列

多线程编程之无锁队列

带危险指针的无锁内存回收

lockFreeQueue 无锁队列实现与总结

多线程单连接中的 PDO::lastInsertId() 是不是安全?

无锁队列的实现