数组的总和是一个小问题,我们必须遍历整个数组来添加数组中的每个元素。但是,当元素的数量太大时,可能会花费很多时间。但这可以通过将数组划分为多个部分并同时找到每个部分的总和(即通过并行查找每个部分的总和)来解决。
这可以通过使用多线程来完成,其中使用了处理器的每个内核。在我们的例子中,每个核心将评估一个部分的总和,最后我们将所有部分的总和相加以获得最终总和。这样,我们可以提高程序的性能,并利用处理器的核心。
每个内核最好使用一个线程。尽管您可以根据需要创建任意数量的线程,以更好地理解多线程。
例子:
Input : 1, 5, 7, 10, 12, 14, 15, 18, 20, 22, 25, 27, 30, 64, 110, 220
Output : sum is 600
Input : 10, 50, 70, 100, 120, 140, 150, 180, 200, 220, 250, 270, 300, 640, 110, 220
Output : sum is 3030
注–建议在基于Linux的系统中执行该程序。
使用以下代码在linux中编译:
g++ -pthread program_name.cpp
代码 –
// CPP Program to find sum of array
#include
#include
// size of array
#define MAX 16
// maximum number of threads
#define MAX_THREAD 4
using namespace std;
int a[] = { 1, 5, 7, 10, 12, 14, 15, 18, 20, 22, 25, 27, 30, 64, 110, 220 };
int sum[4] = { 0 };
int part = 0;
void* sum_array(void* arg)
{
// Each thread computes sum of 1/4th of array
int thread_part = part++;
for (int i = thread_part * (MAX / 4); i < (thread_part + 1) * (MAX / 4); i++)
sum[thread_part] += a[i];
}
// Driver Code
int main()
{
pthread_t threads[MAX_THREAD];
// Creating 4 threads
for (int i = 0; i < MAX_THREAD; i++)
pthread_create(&threads[i], NULL, sum_array, (void*)NULL);
// joining 4 threads i.e. waiting for all 4 threads to complete
for (int i = 0; i < MAX_THREAD; i++)
pthread_join(threads[i], NULL);
// adding sum of all 4 parts
int total_sum = 0;
for (int i = 0; i < MAX_THREAD; i++)
total_sum += sum[i];
cout << "sum is " << total_sum << endl;
return 0;
}
输出:
sum is 600