1.设一个int型的一维数组,数组长度是1,000,000,计算数组全部元素的和。 要求: 1)编制一个串行程序,仅有一个线程完成上述计算。2)编制一个多线程程序,除main线程外,派生两个子线程完成上述计算,main线程负责数据输入和输出计算结果,两个子线程发执行共同计算。
时间: 2024-02-17 17:02:14 浏览: 217
并行计算求数组元素和
以下是一个C++程序,用于计算一个包含1000000个元素的整型数组的总和。它包括一个串行版本和一个多线程版本,其中使用两个线程来并行计算数组的一半。
```c++
#include <iostream>
#include <pthread.h>
#define NUM_THREADS 2
#define ARRAY_SIZE 1000000
int array[ARRAY_SIZE];
int sum = 0;
pthread_mutex_t mutex;
void* calculateSum(void* threadid) {
long tid = (long)threadid;
int start = tid * (ARRAY_SIZE / NUM_THREADS);
int end = start + (ARRAY_SIZE / NUM_THREADS);
int localSum = 0;
for (int i = start; i < end; i++) {
localSum += array[i];
}
pthread_mutex_lock(&mutex);
sum += localSum;
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
int main() {
pthread_t threads[NUM_THREADS];
pthread_mutex_init(&mutex, NULL);
// 初始化数组
for (int i = 0; i < ARRAY_SIZE; i++) {
array[i] = i + 1;
}
// 串行版本
for (int i = 0; i < ARRAY_SIZE; i++) {
sum += array[i];
}
std::cout << "The sum of the array (serial) is: " << sum << std::endl;
// 多线程版本
sum = 0; // 重置sum
for (long i = 0; i < NUM_THREADS; i++) {
int rc = pthread_create(&threads[i], NULL, calculateSum, (void*)i);
if (rc) {
std::cout << "Error: unable to create thread, " << rc << std::endl;
exit(-1);
}
}
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&mutex);
std::cout << "The sum of the array (parallel) is: " << sum << std::endl;
pthread_exit(NULL);
}
```
在上述程序中,我们首先初始化了一个包含1000000个元素的整型数组。然后,我们计算了整个数组的总和,分别使用串行和多线程两种方法。
在多线程版本中,我们使用了互斥锁来保护对共享变量sum的访问。我们创建了两个子线程来计算数组的一半,并将它们的计算结果添加到sum中。主线程等待两个子线程完成计算后,输出计算结果。
需要注意的是,在多线程版本中,我们需要重置sum的值,以便在多个线程中使用。否则,每个线程将计算其自己的本地和,而不是总和。
阅读全文