这篇文章上次修改于 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;
}
没有评论