使用 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 查找数组的和,我们可以同时并行计算数组的两个或多个部分的和。这种并行执行是多线程的核心概念,用于减少整个问题的计算时间。
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP