程序 3.c 使用 2 个线程计算从 1 到 200 的累加和,请将其改为用 3 个线程实现, 3 个线程分别完成函数 p1、p2 和 p3 的计算任务,总体功能不变。
时间: 2023-04-27 17:04:56 浏览: 236
程序3.c使用2个线程计算从1到200的累加和,现在需要将其改为用3个线程实现。可以将原来的计算任务分成3个部分,分别交给3个线程完成。具体地,可以定义3个函数p1、p2和p3,分别计算1~66、67~133和134~200的累加和。然后,创建3个线程,分别执行这3个函数。最后,等待3个线程都执行完毕,将它们的计算结果相加即可得到1~200的累加和。这样就实现了用3个线程计算从1到200的累加和的功能。
相关问题
本关任务:程序 3.c 使用 2 个线程计算从 1 到 200 的累加和,请将其改为用 3 个线
本关任务是将程序3.c中使用2个线程计算从1到200的累加和改为使用3个线程进行计算。
要实现这一目标,我们需要对原来的程序进行适当修改。具体的修改方法如下:
1. 首先,我们需要在程序中增加一个额外的线程,即将原来只有2个线程的计算方式改为3个线程。
2. 将原有的循环“for (i = 1; i <= 100; i++)”修改为“for (i = 1; i <= 67; i++)”。这样可以保证每个线程都能处理到100个数字的累加和。
3. 改变线程的创建和执行的逻辑,使得其中一个线程计算1到67的累加和,另一个线程计算68到134的累加和,第三个线程计算135到200的累加和。
4. 需要在主线程中等待所有线程结束后,计算出三个子线程的累加和的和。
修改完成后的程序运行逻辑如下:
1. 创建3个线程,每个线程对应一个不同的累加和计算范围。
2. 线程1计算1到67的累加和,线程2计算68到134的累加和,线程3计算135到200的累加和。
3. 主线程等待所有子线程结束。
4. 计算三个子线程的累加和的和,并输出结果。
通过以上的修改,即可实现将原来使用2个线程计算的累加和改为使用3个线程进行计算的目标。
这种修改方式保证了每个线程都处理到一定数量的数字,并且在所有线程都结束后,主线程将这些线程的计算结果相加得到最终的累加和。
程序 3.c 使用 2 个线程计算从 1 到 200 的累加和,请将其改为用 3 个线程实现, 3 个线程分别完成函数 p1、p2 和 p3 的计算任务,总体功能不变c语言
修改后的程序如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define N 200
int sum1, sum2, sum3;
pthread_mutex_t mutex1, mutex2;
void *p1(void *arg)
{
int i;
for(i = 1; i <= N/3; i++)
{
pthread_mutex_lock(&mutex1);
sum1 += i;
pthread_mutex_unlock(&mutex2);
}
pthread_exit(NULL);
}
void *p2(void *arg)
{
int i;
for(i = N/3 + 1; i <= 2*N/3; i++)
{
pthread_mutex_lock(&mutex1);
sum2 += i;
pthread_mutex_unlock(&mutex2);
}
pthread_exit(NULL);
}
void *p3(void *arg)
{
int i;
for(i = 2*N/3 + 1; i <= N; i++)
{
pthread_mutex_lock(&mutex1);
sum3 += i;
pthread_mutex_unlock(&mutex2);
}
pthread_exit(NULL);
}
int main()
{
pthread_t tid1, tid2, tid3;
pthread_mutex_init(&mutex1, NULL);
pthread_mutex_init(&mutex2, NULL);
pthread_mutex_lock(&mutex2);
pthread_create(&tid1, NULL, p1, NULL);
pthread_create(&tid2, NULL, p2, NULL);
pthread_create(&tid3, NULL, p3, NULL);
pthread_mutex_unlock(&mutex1);
pthread_mutex_unlock(&mutex1);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_join(tid3, NULL);
printf("sum = %d\n", sum1 + sum2 + sum3);
pthread_mutex_destroy(&mutex1);
pthread_mutex_destroy(&mutex2);
return 0;
}
```
这里我们将原来的两个线程改成了三个线程,分别是 p1、p2 和 p3。其中 p1 线程计算 1 到 N/3 的累加和,p2 线程计算 N/3+1 到 2*N/3 的累加和,p3 线程计算 2*N/3+1 到 N 的累加和。每个线程执行完自己的计算后,通过互斥锁将结果累加到 sum1、sum2 和 sum3 中。最后再将三个结果相加即可得到总和。
相关推荐
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)