【问题标题】:Maintaing a constant # of concurrent threads in C++在 C++ 中保持恒定的并发线程数
【发布时间】:2021-09-05 13:50:05
【问题描述】:

我正在尝试让并发在一些 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++ multithreading concurrency


【解决方案1】:

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

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

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

所以,要么是一个大队列,要么是每个组的单独队列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2011-01-02
    • 2021-10-25
    • 2022-01-25
    • 2018-11-06
    • 2020-09-21
    相关资源
    最近更新 更多