如何等待多个线程完成并重用它们?

时间:2018-09-19 04:20:43

标签: c++ multithreading

我有一个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;
}

1 个答案:

答案 0 :(得分:2)

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