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

C++STL并发更新固定大小映射中的值-安全吗?

  •  0
  • ImgPrcSng  · 技术社区  · 8 年前

    我有一个C++STL映射

    std::map < std::thread_id, int > some_map num_threads 所有位置在开始时都初始化为0。

    some_map[id1] = 0;
    some_map[id2] = 0;
    ...
    

    问题:如果每个线程将容器修改为

    some_map[std::this_thread::get_id()] = rand() 在每个线程中?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Kyle Knoepfel    8 年前

    如前所述 here const 线程安全,因此调用任何 常数 -合格的成员函数不会导致数据竞争。自从 std::map::operator[] 不是一个 常数 -合格,不能保证螺纹安全。

    即使 确保不会调用线程不安全的函数(即。 insert , erase ),除非您了解 std::map ,这可能取决于库(GCC、Clang等),请小心调用 标准::映射::运算符[] 来自共享对象上的多个线程。

    如果需要类似映射的行为,请考虑使用专门设计为线程安全的容器(例如Intel的TBB) concurrent_hash_map ).