如果永远不会使std :: map访问线程的迭代器安全,则它是安全的

时间:2019-03-07 02:18:02

标签: c++ c++11 atomic

所以我想生成一个像这样的地图:std::map<std::string, std::atomic<bool>>。我的用例是一些运行时检查,以查看是否满足某些条件(是非)。并且我将条件检查的结果缓存在此地图中,因为这些检查很昂贵。

这个想法是,我先用std::call_once填充此地图,然后再也不删除或插入元素。但是,我可以通过find()并发访问它,并且这些访问可能会使用store(true)更改std::atomic值的值。

现在我想知道这是否是线程安全的吗?我必须承认我感觉自己处在未定义的行为范围内。

1 个答案:

答案 0 :(得分:1)

  

如果std :: map访问线程永远不会使迭代器无效,那么它是否安全

这不是一个充分的前提条件。插入不会使迭代器无效,但会引起与其他访问线程的竞争。

  

想法是我预先填充这张地图

这似乎足够。只要没有线程对其进行修改,从多个线程同时读取(查找,遍历等)标准映射是安全的。

  

,这些访问可能会更改std::atomic

的值

即使写一个原子对象,访问也是线程安全的。但是请记住,多个原子操作的序列并不是一个整体。