📌  相关文章
📜  使用pthreads的数组的总和

📅  最后修改于: 2021-05-07 07:41:17             🧑  作者: Mango

数组的总和是一个小问题,我们必须遍历整个数组来添加数组中的每个元素。但是,当元素的数量太大时,可能会花费很多时间。但这可以通过将数组划分为多个部分并同时找到每个部分的总和(即通过并行查找每个部分的总和)来解决。

这可以通过使用多线程来完成,其中使用了处理器的每个内核。在我们的例子中,每个核心将评估一个部分的总和,最后我们将所有部分的总和相加以获得最终总和。这样,我们可以提高程序的性能,并利用处理器的核心。

每个内核最好使用一个线程。尽管您可以根据需要创建任意数量的线程,以更好地理解多线程。

例子:

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