【发布时间】:2018-07-23 01:10:37
【问题描述】:
假设我有一个很大的std::map<SomeType1, std::vector<SomeType2>> my_map,我需要对地图中的所有向量进行排序。目前我在单线程中运行:
for (auto& item : my_map)
{
std::sort(item.second.begin(), item.second.end(), &some_comparer);
}
使用上面的代码,我的 CPU 一直闲置在大约 15% 左右,所以我认为我可以将地图分成更小的部分,并在单独的线程中对每个部分进行排序。
我想问一下,如何划分地图?比如我想把它分成4个部分:
auto& section1 = my_map.divide(0, 0.25); // <~ how to apply this?
auto& section2 = my_map.divide(0.25, 0.5);
auto& section1 = my_map.divide(0.5, 0.75);
auto& section1 = my_map.divide(0.5, 1);
std::thread thread1([§ion1] { sort_for_me_pls(section1); });
std::thread thread2([§ion2] { sort_for_me_pls(section2); });
std::thread thread3([§ion3] { sort_for_me_pls(section3); });
std::thread thread4([§ion4] { sort_for_me_pls(section4); });
thread1.join();
thread2.join();
thread3.join();
thread4.join();
【问题讨论】:
-
为什么不简单地对向量进行并行排序,即,每个线程一个向量?划分工作负载然后将其连接在一起(合并排序段等)非常麻烦。
-
@Snps 我也想学习如何并行排序向量,但目前我不知道如何编写线程池管理器来处理线程。你能把答案贴出来吗?
标签: c++ multithreading algorithm vector hashmap