c - 没有锁的一插入多读列表安全吗?

标签 c multithreading data-structures concurrency synchronization

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

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

只有 1 个线程只向这个列表中插入项目,但从不删除项目。添加项目的方式:

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) 指令。

关于c - 没有锁的一插入多读列表安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49032807/

相关文章:

c++ - Windows OS的I/O优先级

java - static volatile boolean - 线程没有被终止

c++ - 主线程等待 std::async 完成

c++ - C++中的排序列表

algorithm - 每个数字的互质数

java - 当我运行此代码时,仅显示两个节点的数据和新节点的数据,但不显示第三个和第四个节点的数据

c - 在c中使用char 2d数组的段错误

c - 我有一个字符串 str,它有两个数组(可以更多),我想将它们转换为 C 中的整数数组

c - 如何在 C 中正确创建二维 int 数组的数组?

python - Python 守护进程关闭问题的调试技术