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