我有一个表格的集合:
map<key, list<object> >
我只在列表的后面插入,有时我从整个地图中读取(但我从不写入地图,除非在初始化时)。
据我了解,没有一个 STL 容器是线程安全的,但我实际上每个键最多只能有一个线程。假设我对这种安排非常安全,我是否遗漏了什么?
我有一个表格的集合:
map<key, list<object> >
我只在列表的后面插入,有时我从整个地图中读取(但我从不写入地图,除非在初始化时)。
据我了解,没有一个 STL 容器是线程安全的,但我实际上每个键最多只能有一个线程。假设我对这种安排非常安全,我是否遗漏了什么?
如果在多线程场景中从未修改过地图,那么您就可以了。如果每个线程都查看自己的列表,那么这就是线程私有数据,所以你也可以。
注意不要尝试使用 [] 查找键,因为如果该键在地图中尚不存在,它将插入(修改)。
但是,我很好奇你为什么需要这个结构 - 为什么不在每个线程的堆栈上保留一个指针/引用或实际的列表对象本身,因为它对每个线程都是私有的?
(如果不是,那么您需要在列表上进行适当的同步。)
实际上,您说您“从整个地图中读取”-大概意味着任何随机线程都可能尝试遍历任何列表。所以你肯定需要同步列表上的操作。
TBH,只要您在任何写入和读取周围放置一个关键部分,它就可以正常工作。