c++ - 在 C++ 中保持恒定的并发线程数
问题描述
我试图让并发在一些 C++ 代码中工作,特别是我有一组大约 10k 的子问题,我单独解决这些子问题以寻找最佳的整体解决方案。我尝试一次创建 8 个线程以同时工作并等待它们全部加入,但问题是它必须等待所有线程加入才能启动另外 8 个线程,即每组 8 个子问题仅解决的速度与其最慢的解决方案一样快。您如何设置它以便始终有 8 个并发线程,即一个新线程在另一个线程结束时立即启动?
以下是我想转换为并行的串行代码部分:
// Implement multithreading here
for (int i = 0; i < n; i++)
{
solver.moves = sols[i];
Solution cur_sol = solver.solve(s->clone());
std::cout << "Solution " << i << " had a best possible solve of cost " << cur_sol.cost << std::endl;
if (cur_sol.cost < best_cost)
{
best = cur_sol;
best_cost = best.cost;
}
}
return best;
解决方案
您需要两个队列:一个用于未解决的解决方案,一个用于已解决的解决方案。当未解决的队列不为空时,每个线程将从队列中挑选(弹出)一个解决方案,解决它,并将其放入(推送)到已解决的队列中。
主线程可以等到一个组完成并处理它。
这里唯一重要的(除了同步)是,“组”求解器知道哪个求解的解决方案属于哪个组。
因此,每个组要么有一个大队列,要么有单独的队列。
推荐阅读
- android - 如何在 ConstraintLayout 中截屏?
- php - 如何在 Laravel 中为用户创建提醒
- php - PHP-FPM 可以创建 slow.log 但不能将内容写入 slow.log
- r - 在同一个文件中使用两个版本的 openxlsx 分叉
- c - 如何一次设置 GDB 调试打印选项?
- java - 无法通过 USB 从标签打印机打印
- qt - 从 QT 应用程序创建一个 .deb 包
- angular - 如何修复“无法读取未定义的属性‘标题’”
- apache-kafka - 如何停止处理从 kafka 轮询的导致 k8s pod 重启的有问题的记录
- php - 从 Ajax 传递数据时 PHP 未定义错误