给出代码关于多线程编程实现:程序 3.c 使用 2 个线程计算从 1 到 200 的累加和,请将其改为用 3 个线程实现, 3 个线程分别完成函数 p1、p2 和 p3 的计算任务,总体功能不变
时间: 2023-11-08 11:03:52 浏览: 158
以下是修改后的代码:
```c
#include <stdio.h>
#include <pthread.h>
int sum = 0; // 全局变量,存储累加和
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
// 线程一计算任务
void *p1(void *arg) {
int i;
for (i = 1; i <= 100; i++) {
pthread_mutex_lock(&mutex);
sum += i;
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
// 线程二计算任务
void *p2(void *arg) {
int i;
for (i = 101; i <= 200; i++) {
pthread_mutex_lock(&mutex);
sum += i;
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
// 线程三计算任务
void *p3(void *arg) {
int i;
for (i = 201; i <= 300; i++) {
pthread_mutex_lock(&mutex);
sum += i;
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
int main() {
pthread_t tid1, tid2, tid3; // 线程 ID
pthread_create(&tid1, NULL, p1, NULL); // 创建线程一
pthread_create(&tid2, NULL, p2, NULL); // 创建线程二
pthread_create(&tid3, NULL, p3, NULL); // 创建线程三
pthread_join(tid1, NULL); // 等待线程一结束
pthread_join(tid2, NULL); // 等待线程二结束
pthread_join(tid3, NULL); // 等待线程三结束
printf("1+2+...+300=%d\n", sum); // 输出结果
return 0;
}
```
在原有的基础上,新增了 `p3` 函数用于计算 201 到 300 的累加和,同时在 `main` 函数中新增了创建和等待线程三的代码。由于全局变量 `sum` 可能会被多个线程同时修改,因此需要使用互斥锁来保证线程安全。
相关推荐
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)