这篇文章上次修改于 903 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

注意:在 for 循环内部,仍然要注意写互斥,比如,对 map 的写操作就不是线程安全的,除非 map 中已经预先填好了 key,这时候更新 value 是线程安全的,因为不同的线程中获得的 key 是不一样的。

pragma omp

  // 编译:bazel build modules/map/hdmap:main  --cxxopt="-fopenmp"
  // 或者在 .bazelrc 中添加:build --cxxopt="-fopenmp"

  // std::vector<std::shared_ptr<LaneInfo>> lans_; 为成员变量
  lans_.resize(map_.lane().size());
  #pragma omp parallel for
  for (int i = 0; i < map_.lane().size(); i++) {
    lans_[i].reset(new LaneInfo(map_.lane()[i]));
  }
  
  for (const auto& lane : lans_) {
    lane_table_[lane->id().id()] = lane;
  }
  

或者:

  for (int i = 0; i < map_.lane().size(); i++) {
    lane_table_[map_.lane()[i].id().id()] = nullptr;
  }

  #pragma omp parallel for
  for (int i = 0; i < map_.lane().size(); i++) {
    lane_table_[map_.lane()[i].id().id()].reset(new LaneInfo(map_.lane()[i]));
  }

多线程并行

  #include <future>

  std::vector<std::future<void>> lans_func;
  int batch = std::max(1, map_.lane().size() / kParallelCount);
  for (int i = 0; i < map_.lane().size(); i += batch) {
    lans_func.emplace_back(async(std::launch::async, [&, i] {  // 注意,i 按值传递
      for (int j = i; j < i + batch && j < map_.lane().size(); j++) {
        lans_[j].reset(new LaneInfo(map_.lane()[j]));
      }
    }));
  }

  for (auto& func : lans_func) {
    func.wait();
  }
  
  for (const auto& lane : lans_) {
    lane_table_[lane->id().id()] = lane;
  }