【问题标题】:Thread safety of fixed sized stl map固定大小的stl map的线程安全
【发布时间】:2017-08-27 07:17:50
【问题描述】:

我有一个 stl 映射,其中整数作为键,类对象的向量作为其值。

class foo {
    // provides wrapper around std::queue for thread safety
    private :
       std::queue<>
}

std::map<unsigned int, std::vector<foo *> > mymap;

foo 类只是 std::queue 实现的线程安全包装器。 现在进入实际问题 - 此映射用于多线程场景,其中每个线程根据创建期间传递的参数访问相应的向量。

假设我创建了 4 个线程并传递了 0,1,2,3 作为参数:

thread 0 - mymap[0];
thread 1 - mymap[1];
thread 2 - mymap[2];
thread 3 - mymap[3];
  1. 地图的大小在创建过程中是固定的,不会更改。

我需要让我的地图线程安全吗?

  1. 因为地图的大小是固定的,所以地图不会重新排序。
  2. 每个线程仅根据其 id 更改其对应的向量。

【问题讨论】:

  • 从多线程读取是安全的。看看这个 - stackoverflow.com/questions/1846186/…
  • 我的情况是矢量大小被修改。只有地图的大小保持一致
  • 我想知道在这些线程与main() 线程连接后,在向量中插入或删除某些元素是否反映在相应的mymap[] 向量中。在任何情况下,这些向量都不会在线程之间共享。所以应该没问题。
  • 为什么不改用std::thread_local。见这里en.cppreference.com/w/cpp/keyword/thread_local。从您的描述看来,这就是您所需要的,以防您不迭代整个 map 以从各种 vectors 检索一些数据

标签: c++ multithreading stl


【解决方案1】:

不,您不需要添加额外的同步来使std::map 线程安全使用。您仅在初始化期间修改地图节点,之后您仅在读取地图。 map的并发读取是没有问题的,因为它的结构没有改变。

您正在修改地图中的这一事实并不重要,因为它们不会影响地图的排序和结构。

【讨论】:

    猜你喜欢
    • 2011-08-20
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2013-02-10
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多