本关任务:程序 3.c 使用 2 个线程计算从 1 到 200 的累加和,请将其改为用 3 个线程实现, 3 个线程分别完成函数 p1、p2 和 p3 的计算任务,总体功能不变。在头歌的实验环境中
时间: 2024-10-08 16:00:59 浏览: 43
为了将一个使用两个线程计算1到200累加和的程序改写成使用三个线程,首先我们需要确定每个线程的任务范围。由于总共有200个数,我们可以把任务分成三部分,让每个线程负责大约67个数的计算。我们可以创建三个线程P1、P2和P3,并定义它们各自的计算范围:
```c
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#define THREAD_COUNT 3
#define TASK_SIZE (200 / THREAD_COUNT)
void* p1(void* arg) {
int start = 1;
int end = start + TASK_SIZE - 1;
long long sum = 0;
for (int i = start; i <= end; ++i) {
sum += i;
}
printf("Thread P1: Sum from %d to %d is %lld\n", start, end, sum);
return NULL;
}
void* p2(void* arg) {
// 类似于p1,计算68到134之间的和
// ...
return NULL;
}
void* p3(void* arg) {
// 类似于p1,计算135到200之间的和
// ...
return NULL;
}
int main() {
pthread_t threads[THREAD_COUNT];
// 创建并启动线程
for (int i = 0; i < THREAD_COUNT; ++i) {
int range_start = (i * TASK_SIZE) + 1;
if (i == THREAD_COUNT - 1) { // 尾部线程处理剩余的部分
range_end = 200;
} else {
range_end = range_start + TASK_SIZE - 1;
}
pthread_create(&threads[i], NULL, &p1, (void*)range_start); // 或者使用p2/p3函数名
}
// 等待所有线程结束
for (int i = 0; i < THREAD_COUNT; ++i) {
pthread_join(threads[i], NULL);
}
printf("Total sum from 1 to 200 is: %lld\n", sum_from_all_threads);
return 0;
}
```
在这个示例中,你需要为`p2`和`p3`编写相应的计算部分,并替换掉上述代码中的`// 类似于p1,...`部分。同时,`main`函数中的`sum_from_all_threads`需要维护一个全局变量,用于合并所有线程的结果。
阅读全文