gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:46 28 4
gpt4 key购买 nike

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

我有一个普通的 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com