假设有一个数组A,长度为N,其中每个元素都是一个整数。请编写一个程序,创建M个线程,每个线程计算数组A的一个子数组的和,并把结果累加到一个全局变量S中。当所有线程结束后,主线程输出S的值。用C语言实现
时间: 2024-11-20 09:56:03 浏览: 22
在C语言中,为了实现这个任务,你可以使用POSIX线程库(pthread)。这里是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define N 100
#define M 5
#define SIZE (N / M)
typedef long long int sum_type;
// 全局变量
static sum_type global_sum = 0;
static pthread_mutex_t mutex; // 锁用于同步对全局变量的操作
void* thread_func(void* arg) {
int start, end, i;
start = (int)arg;
end = start + SIZE - 1;
pthread_mutex_lock(&mutex); // 获取锁
for (i = start; i <= end; i++) {
global_sum += A[i]; // 计算子数组和
}
pthread_mutex_unlock(&mutex); // 释放锁
return NULL;
}
int main() {
int i, thread_ids[M];
int A[N] = { ... }; // 初始化数组A
pthread_mutex_init(&mutex, NULL);
// 创建并启动线程
for (i = 0; i < M; i++) {
thread_ids[i] = pthread_create(NULL, NULL, thread_func, (void*)(i * SIZE));
}
// 等待所有线程完成
for (i = 0; i < M; i++) {
if (pthread_join(thread_ids[i], NULL) != 0) {
printf("Error: Unable to join thread %d\n", i);
exit(1);
}
}
// 输出结果
printf("Global sum is: %lld\n", global_sum);
pthread_mutex_destroy(&mutex); // 销毁锁
return 0;
}
```
在这个示例中,我们首先初始化一个全局变量`global_sum`作为累加器,以及一个互斥锁`mutex`用于保护数据的一致性。然后创建了M个线程,每个线程负责计算数组A的一部分和,并通过锁来安全地更新全局总和。
注意,实际应用中你需要处理线程创建错误和其他可能出现的问题,如数组A的初始化和错误处理。此外,`SIZE`需要适当地调整以便将数组均匀分配给线程。
阅读全文