C语言计算线程负责计算(1到100的累加,每次加一个数后都要打印),结果为偶数由打印线程1打印,奇数由打印线程2打印
时间: 2024-05-10 08:15:58 浏览: 13
以下是一种可能的解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define MAX_NUM 100
int sum = 0; // 累加和
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
void *compute_thread(void *arg) {
for (int i = 1; i <= MAX_NUM; i++) {
pthread_mutex_lock(&mutex); // 加锁
sum += i;
if (sum % 2 == 0) {
printf("compute_thread: %d is even\n", sum);
pthread_mutex_unlock(&mutex); // 解锁
pthread_cond_signal((pthread_cond_t *)arg); // 唤醒打印线程1
}
else {
printf("compute_thread: %d is odd\n", sum);
pthread_mutex_unlock(&mutex); // 解锁
pthread_cond_signal((pthread_cond_t *)(arg + sizeof(pthread_cond_t))); // 唤醒打印线程2
}
}
pthread_exit(NULL);
}
void *print_thread1(void *arg) {
pthread_cond_t *cond = (pthread_cond_t *)arg;
while (1) {
pthread_mutex_lock(&mutex); // 加锁
pthread_cond_wait(cond, &mutex); // 等待唤醒
printf("print_thread1: %d\n", sum);
pthread_mutex_unlock(&mutex); // 解锁
if (sum == MAX_NUM * (MAX_NUM + 1) / 2) break; // 如果计算完毕,则退出循环
}
pthread_exit(NULL);
}
void *print_thread2(void *arg) {
pthread_cond_t *cond = (pthread_cond_t *)(arg + sizeof(pthread_cond_t));
while (1) {
pthread_mutex_lock(&mutex); // 加锁
pthread_cond_wait(cond, &mutex); // 等待唤醒
printf("print_thread2: %d\n", sum);
pthread_mutex_unlock(&mutex); // 解锁
if (sum == MAX_NUM * (MAX_NUM + 1) / 2) break; // 如果计算完毕,则退出循环
}
pthread_exit(NULL);
}
int main() {
pthread_t c_tid, p_tid1, p_tid2;
pthread_cond_t cond[2];
pthread_cond_init(&cond[0], NULL);
pthread_cond_init(&cond[1], NULL);
pthread_create(&c_tid, NULL, compute_thread, (void *)cond);
pthread_create(&p_tid1, NULL, print_thread1, (void *)&cond[0]);
pthread_create(&p_tid2, NULL, print_thread2, (void *)&cond[0]);
pthread_join(c_tid, NULL);
pthread_join(p_tid1, NULL);
pthread_join(p_tid2, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond[0]);
pthread_cond_destroy(&cond[1]);
return 0;
}
```
该解决方案中,使用了一个互斥锁 `mutex` 和两个条件变量 `cond[2]` 来实现线程同步。其中,计算线程 `compute_thread` 负责计算累加和,并在和为偶数或奇数时唤醒相应的打印线程;打印线程1 `print_thread1` 和打印线程2 `print_thread2` 分别等待计算线程的唤醒,并在唤醒后打印相应的结果。需要注意的是,打印线程1 和打印线程2 共用一个条件变量数组 `cond[2]`,但在传递给 `pthread_cond_signal` 函数时需要根据打印线程的不同选择不同的条件变量。同时,为了防止计算线程提前退出,需要在打印线程中检查累加和是否已经达到了目标值(即 1 到 100 的累加和),如果是则退出循环。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)