程序 3.c 使用 2 个线程计算从 1 到 200 的累加和,请将其改为用 3 个线程实现, 3 个线程分别完成函数 p1、p2 和 p3 的计算任务,总体功能不变c语言
时间: 2023-11-07 12:04:43 浏览: 290
实体店和官网分别代表两个线程,共同卖100个水杯.txt
修改后的程序如下所示:
```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 中。最后再将三个结果相加即可得到总和。
阅读全文