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

时间:2018-02-28 15:13:15

标签: c multithreading data-structures concurrency synchronization

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

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

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

new_item->next = list_head;
list_head = new_item;

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

根本没有锁定。

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

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

提前致谢

1 个答案:

答案 0 :(得分:1)

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

如果这些读/写是 atomic ,那么就没有数据竞争。据我所知,在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)指令。