代码之家  ›  专栏  ›  技术社区  ›  hookenz

stl-map或hashmaps是线程安全的吗?

  •  4
  • hookenz  · 技术社区  · 14 年前

    我可以在多线程程序中使用map或hashmap而不需要锁吗? 也就是说,它们是安全的吗?

    我希望同时从地图中添加和删除。

    外面似乎有很多相互矛盾的信息。

    顺便说一下,我正在使用Ubuntu10.04下gcc附带的stl库。

    编辑:就像互联网的其他部分一样,我似乎得到了矛盾的答案?

    5 回复  |  直到 14 年前
        1
  •  14
  •   Steven Sudit    14 年前

    您可以安全地执行同时读取操作,即调用const成员函数。但是,如果其中一个涉及到写入操作,则不能同时执行任何操作,即非常量成员函数的调用对于容器来说应该是唯一的,并且不能与任何其他调用混合。

    也就是说,不能从多个线程更改容器。所以你需要使用lock/rw锁 以确保通道安全。

        2
  •  4
  •   Steven Sudit    14 年前

    不。

    诚实的。不。

    编辑

    好的,我来鉴定一下。

    可以有任意数量的线程读取同一映射。这是有道理的,因为阅读它没有任何副作用,所以其他人是否也在做它并不重要。

    但是,如果您想写入它,那么您需要获得独占访问权,这意味着阻止任何其他线程写入 阅读直到你完成。

    您最初的问题是关于并行添加和删除。因为它们都是写的,所以对于它们是否是线程安全的答案是一个简单、明确的“否”。

        3
  •  4
  •   ronag    14 年前

    tbb是一个免费的开放源码库,提供线程安全的关联容器。( http://www.threadingbuildingblocks.org/ )

        4
  •  2
  •   Eugen Constantin Dinca Chris Lohfink    14 年前

    STL容器线程安全最常用的模型是 SGI 一:

    STL的SGI实现是线程安全的,仅在以下意义上 同时访问distinct 容器是安全的,同时 读取对共享容器的访问 是安全的。

    但最终,这取决于STL库的作者——Afaik,该标准对STL的线程安全没有任何规定。

    但是根据 docs 如果满足一些条件,GNU的stdc++实现将遵循它(从gcc 3.0+开始)。

    缺氧缺血性脑病

        5
  •  0
  •   Daniel    14 年前

    答案(像大多数线程问题一样)是它大多数时候都能工作。不幸的是,如果你在地图调整大小时捕捉到它,那么你最终会遇到麻烦。所以没有。

    要获得最佳性能,您需要一个多级锁。首先是一个读锁,它允许访问器不能修改映射,并且可以由多个线程持有(多个线程读取项正常)。其次是一个独占的写锁,它允许以不安全的方式(添加、删除等)修改映射。

    编辑 读写器锁很好,但是它们是否优于标准互斥锁取决于使用模式。我也不能不了解更多就推荐。同时分析两者,看看哪一个最适合你的需要。