【发布时间】: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