【发布时间】:2021-11-27 10:17:26
【问题描述】:
我有一个如下的数据结构:
struct Count {
uint64_t rcvd;
uint64_t sent;
} ;
std::unordered_map<int, Count> sCount;
Thread1- Writer(仅 stl 无序映射插入操作),Thread2- Reader(总是通过 const 迭代器访问,例如 const begin() 到 const end())
这个操作是线程安全的吗? 我对这个文档的阅读 - https://en.cppreference.com/w/cpp/container ('Iterator invalidation' 和 'Thread safety') 表明我的并发操作是线程安全的,因为迭代器永远不会失效。但是我在任何地方都没有看到明确的提及(与单个插入、单个 const 迭代器有关),并且 StackOverflow 中的其他相关问题告诉我在插入之前始终使用锁。我正在执行一个性能关键的操作,我不能使用锁。
编辑:在没有无锁选项的情况下,我最好的选择是什么?我正在寻找一个偶尔的插入操作(快速且非阻塞)和一个缓慢但更频繁的阅读器(常量迭代器)?
【问题讨论】:
-
"[...] 因为迭代器永远不会失效。" 实际上这不是真的。插入新元素时可能会发生重新散列。如果发生这种情况,所有以前使用的迭代器都会失效。
-
@Fareanor 您的声明有参考资料吗?从问题中的链接(迭代器有效性的表列表)中,它清楚地表明迭代器在插入后有效。您的意思是说该文件有误吗?
-
你在哪里看到的? linked reference 明确提到了我所说的(查看表中的“有条件”列)。如果您想要第二个证明,here 您可以看到确切的声明“如果由于插入而发生重新散列,则所有迭代器都将失效。”
标签: c++ multithreading stl unordered-map