所以我想生成一个像这样的地图:std::map<std::string, std::atomic<bool>>
。我的用例是一些运行时检查,以查看是否满足某些条件(是非)。并且我将条件检查的结果缓存在此地图中,因为这些检查很昂贵。
这个想法是,我先用std::call_once
填充此地图,然后再也不删除或插入元素。但是,我可以通过find()并发访问它,并且这些访问可能会使用store(true)更改std::atomic
值的值。
现在我想知道这是否是线程安全的吗?我必须承认我感觉自己处在未定义的行为范围内。
答案 0 :(得分:1)
如果std :: map访问线程永远不会使迭代器无效,那么它是否安全
这不是一个充分的前提条件。插入不会使迭代器无效,但会引起与其他访问线程的竞争。
想法是我预先填充这张地图
这似乎足够。只要没有线程对其进行修改,从多个线程同时读取(查找,遍历等)标准映射是安全的。
,这些访问可能会更改
的值std::atomic
即使写一个原子对象,访问也是线程安全的。但是请记住,多个原子操作的序列并不是一个整体。