首页 > 解决方案 > 在 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;

标签: c++multithreadingconcurrency

解决方案


您需要两个队列:一个用于未解决的解决方案,一个用于已解决的解决方案。当未解决的队列不为空时,每个线程将从队列中挑选(弹出)一个解决方案,解决它,并将其放入(推送)到已解决的队列中。

主线程可以等到一个组完成并处理它。

这里唯一重要的(除了同步)是,“组”求解器知道哪个求解的解决方案属于哪个组。

因此,每个组要么有一个大队列,要么有单独的队列。


推荐阅读