【问题标题】:How to wait for multiple threads to complete and reuse them?如何等待多个线程完成并重用它们?
【发布时间】:2019-02-23 03:56:38
【问题描述】:

我有一个 C++ 程序,它尝试并行处理数组的每一行,并且在一行完全完成后,它会移动到下一行。我当前的程序为每一行数组创建一个线程,并在使用后加入它们。但似乎该程序在创建/关闭线程上浪费了很多时间。

有没有办法只创建一次这些线程,并且对于每一行它们等待最慢的线程完成,然后执行下一行的函数?

这是我的示例代码:

#include <iostream>
#include <thread>
using namespace std;
#define THREAD 5
int arr[2][10000];
void update_arr(int i, int j_s, int j_to){
    for (int j = j_s; j <= j_to; j++)
        arr[i%2][j]= arr[(i-1)%2][j]+2*arr[(i-1)%2][j-1];
}

int main(){
    for (int i = 0; i < 10000; i++) arr[0][i] = 1;
    for (int i = 1; i <= 10000; i++){
        thread t[THREAD];
        for (int ii = 0; ii < THREAD; ii++)
            t[ii] = thread(update_arr, i, ii * 10000 / THREAD, (ii+1) * 10000 / THREAD - 1);

        for (int ii = 0; ii < THREAD; ii++)
            t[ii].join();   
    }
    cout<<arr[1][9999]<<endl;
}

【问题讨论】:

  • 将大量工作批处理到线程中会更好。创建和终止线程的开销很大。
  • 制作int const thread_count = 5;。宏是邪恶的。此外,2 和 10000 是所谓的幻数,可以从为其分配符号名称中受益。
  • 谷歌“c++线程池库”来查找命中。 boost implementation 通常是一个安全的选择。

标签: c++ multithreading


【解决方案1】:

旨在避免这个问题,即创建和销毁线程的成本相对较高。请注意,std::async 类可以使用线程池实现(但不能保证),因此您应该首先考虑使用它。

【讨论】:

  • std::async 是否以线程池的形式实现取决于实现。
  • @Nick :线程池,在最简单的情况下,是一个工作线程的集合,它们都永远循环,从共享的任务中提取,阻塞队列,并执行这些任务。这些任务可能只是函数指针,工作人员通过调用它们来“执行”它们。更典型的是,定义了一些Task接口,带有一个名为run()或call(...)或execute()等的方法,并且任务是实现该接口的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 2019-03-24
  • 2021-10-29
  • 2012-03-04
  • 2012-04-09
  • 2015-08-21
相关资源
最近更新 更多