c++ - std::list 中无锁的并行追加和迭代

标签 c++ multithreading list stl parallel-processing

我在多线程程序中使用 std::list。元素只添加到列表的末尾,只从列表的开头删除。 存在一个写锁来保证写互斥。读者在不获取锁的情况下访问链表。读者维护不能被 erase() 无效的迭代器,因为我保证元素只有在读者传递它们时才会被删除。我能想象的唯一可能的数据竞争是,如果追加了一个元素,并且其中一位读者在插入者写入元素本身之前访问了该元素。

对于单个写入器,追加(在末尾插入)应该是原子的,因为插入新元素需要单次写入。

std::list 显然不提供任何保证,有人可以确认上述用法应该在没有数据竞争的情况下工作。如果没有,是否有提供这种保证的替代方案(例如 boost)?

最佳答案

如您所写,可能会发生竞争条件:

The only possible data race I can imagine is if an element is appended, and one of the readers accesses that element before the inserter has written the element itself.

std::list 也是一个 doubly-linked list ,因此在删除第一个元素时会访问第二个元素,而在添加新元素时会写入旧的最后一个元素。所以你的迭代器必须是常量(没有++iter 或 --iter)。

您可能想看看 boost::lockfree::queue — 它可能正是您正在寻找的。

关于c++ - std::list 中无锁的并行追加和迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28310535/

相关文章:

python - 如何在 Python 中以特定方式重组列表

java - 如何使listiterator背靠背next()和previous()不返回相同的值?

c++ - kill -3 用于 solaris 上的 C++ 应用程序

c++ - 存储对 std::set 对象的引用/指针

具有网络和多线程的 iOS CoreData

android - 所有线程完成后如何正确停止服务

c++ - 为什么 gcov 为 STL header 创建代码覆盖率数据?

C# 到 C++ 代码(使用 CLI)给出错误

python - Pyramid:多线程数据库操作

python - 找出数组中最大的元素是否至少是数组中其他每个数字的两倍?