我正在尝试并行处理
problems
中包含的 vector
。为此,我想首先尝试避免 std::thread
,因为 std 提供了应该涵盖我的用例的并行执行方法。我对如何应用的理解是这样的:
std::vector<SolutionT> solution_vector;
std::mutex mut;
std::for_each(std::execution::par, problems.begin(), problems.end(), [&](const auto& problem) {
auto solution = do_heavy_work(problem)
std::lock_guard guard(mut);
solution_vector.emplace_back(solution);
}
在 CMake 中,我还将线程库添加到可执行文件中(尽管不确定是否有必要?):
find_package(Threads REQUIRED)
target_link_libraries(
executable
PRIVATE
Threads::Threads
)
问题的解决时间从仅仅几毫秒到几十秒不等,因为我的向量中有一千个问题,而且大多数都是较大的问题,所以我期望并行性能够大大加快这个处理时间。
但是,当我运行代码时,我没有观察到生成任何线程。我使用
htop
检查进程,发现只有一个核心被推至 100%,而其余核心则处于空闲状态。
我期望线程与 std::execution::par 结合生成是错误的吗?我是否错过了正确的步骤?
这是在具有 GCC 11.4 和 c++20 的 18 核 Intel x86_64 Ubuntu 22.04 平台上进行测试的。
编辑: 这是一个反映我用法的 godbolt 示例:https://godbolt.org/z/EEMEWr3Wa