关于线程之间的同步我有一个问题。我知道正常的同步方法和无锁列表。但我有一个奇怪的(也许)想法。
我有一个正常的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)
指令。