如果std :: map访问线程永远无效,那么它是否安全

问题描述 投票:2回答:1

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

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

现在我想知道这是否是线程安全的?我必须承认我觉得我在这里处于未定义的行为领域。

c++ c++11 atomic
1个回答
1
投票

如果std :: map访问线程永远无效,那么它是否安全

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

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

这似乎就足够了。只要没有线程修改标准映射,就可以安全地从多个线程同时读取(查找,遍历等)标准映射。

那些访问可能会改变std::atomic的值

访问,甚至编写原子对象也是线程安全的。但请记住,多个原子操作的序列并非整体原子。

© www.soinside.com 2019 - 2024. All rights reserved.