使用 pthreads 計算陣列的和


Pthreads 是一種執行模型,它有助於使用多個處理器同時工作以解決問題。它獨立於程式語言。

問題陳述

給定一個整數陣列。使用 pthreads 查詢陣列中所有元素的和。

計算總和的多執行緒需求

問題是新增陣列中的元素。雖然這是一個簡單的問題,線性遍歷陣列可以很容易地完成工作,時間複雜度為 O(n),其中 n 是陣列中元素的數量。但是,如果我們得到一個非常大的元素陣列,程式執行所需的時間也會增加。

此問題的有效解決方案可以是將陣列分成幾部分,並同時或平行計算每個部分的總和。這個概念稱為多執行緒,其中程式或問題域被分成幾部分,每個部分由不同的執行緒同時處理。這些併發執行的部分中的每一個都稱為執行緒。

因此,如果在上述問題中,我們將陣列分成兩部分並使用多執行緒計算總和,則所需時間將減少 2 倍。如果將陣列分成 x 部分,則程式計算總和所需的時間將減少 x 倍。

建立 Pthread

它建立一個新的可執行執行緒。它傳遞以下引數 -

  • threadID - 新執行緒的識別符號

  • attr - 用於設定執行緒屬性

  • func - 執行緒執行的函式

  • funcArg - 傳遞給 func 的引數

終止 Pthread

當執行緒執行完成並且不再需要時,它將被終止。

pthread_exit (status);

加入 Pthread

加入執行緒意味著在終止 main() 塊之前等待執行緒終止。

pthread_join (threadID, status);

編譯程式

$gcc program.cpp -lpthread

虛擬碼

sumArray[5]
array[15]
tPart = 0
procedure sum ()
   part_of_array = tPart++
   for i = part_of_array*size_of_thread to (part_of_array+1)*size_of_thread
      sumArray[part_of_array] = sumArray[part_of_array] + array[i]
   end for
end procedure

procedure main()
   for i = 0 to 5
      create pthreads[i]
   end for
   for i = 0 to 5
      join pthreads[i]
   end for
   sum = 0
   for i = 0 to 5
      sum = sum + sumArray[i]
   end for
end procedure

輸入輸出

Input: 2, 2, 3, 3, 4, 4, 5, 5, 6, 6
Output: 40

解釋

陣列的五個部分為 - 2、2、3、3、4、4、5、5、6、6

Sum of thread 1 i.e. sumArray[0] = 4
Sum of thread 2 i.e. sumArray[1] = 6
Sum of thread 3 i.e. sumArray[2] = 8
Sum of thread 4 i.e. sumArray[3] = 10
Sum of thread 5 i.e. sumArray[4] = 12
Total sum = 40

示例

在以下程式中,陣列被分成 5 個部分,其總和使用 pthreads 併發計算。建立並加入前 5 個執行緒。每個執行緒執行 sum 函式,其中每個執行緒首先找到它們負責查詢總和的陣列部分,然後計算總和並將結果儲存在一個大小與所有五個陣列部分的總和陣列相同大小的陣列中。稍後,將所有五個部分的總和加起來以找到完整陣列的最終總和。

#include<bits/stdc++.h>
#include<pthread.h>
using namespace std;
// tNum depicts the number of threads the problem is divided into
// Array is divided into 5 parts
int tNum = 5;

// initializing the sum array
int sumArray[5] = {0};
int arr[15] = {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10};

// Calculating the maximum number of elements in each thread
int tSize = ceil(15/tNum), tPart = 0;

// function used by each thread to compute sum
void *sum (void* arg){

   // defining the part of array for which sum is being computed
   int part = tPart;
   tPart++;
   for (int i = part*tSize ; i < (part+1)*tSize ; i++) {
      sumArray[part] += arr[i];
   }
   pthread_exit (NULL);
}

// main() block that calls upon various threads for executing parallelly
int main(){
   pthread_t threadID[tNum];
   
   // 5 threads are created and executed
   for (int i = 0 ; i < tNum ; i++) {
      pthread_create (&threadID[i], NULL, sum, (void*)NULL);
   }
   
   // 5 threads are joined
   for (int i = 0 ; i < tNum ; i++) {
      pthread_join (threadID[i], NULL);
   }
   
   // the sum of all the subparts is added
   int sum = 0;
   for (int i = 0 ; i < tNum ; i++) {
      sum += sumArray[i];
   }
   cout << "Sum of array = " << sum;
   return 0;
}

輸出

Sum of array = 150

結論

總之,使用 pthreads 查詢陣列的和,我們可以同時平行計算陣列的兩個或多個部分的和。這種並行執行是多執行緒的核心概念,用於減少整個問題的計算時間。

更新於: 2023-09-28

943 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.