C语言计算线程负责计算(1到100的累加,每次加一个数后打印一次),结果为偶数由打印线程1打印,奇数由打印线程2打印; 主进程等待子线程退出。
时间: 2024-05-04 12:18:27 浏览: 181
以下是一个可能的实现:
```c
#include <stdio.h>
#include <pthread.h>
int sum = 0; // 累加和
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER; // 条件变量1
pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER; // 条件变量2
int flag = 0; // 标记奇偶性,0表示偶数,1表示奇数
void *calc_thread(void *arg) {
int i;
for (i = 1; i <= 100; i++) {
pthread_mutex_lock(&mutex); // 上锁
sum += i;
if (sum % 2 == 0) { // 偶数
flag = 0;
pthread_cond_signal(&cond1); // 唤醒打印线程1
} else { // 奇数
flag = 1;
pthread_cond_signal(&cond2); // 唤醒打印线程2
}
pthread_mutex_unlock(&mutex); // 解锁
}
return NULL;
}
void *print_thread1(void *arg) {
while (1) {
pthread_mutex_lock(&mutex); // 上锁
while (flag != 0) { // 等待条件1
pthread_cond_wait(&cond1, &mutex);
}
printf("current sum is %d\n", sum);
pthread_mutex_unlock(&mutex); // 解锁
if (sum == 5050) { // 如果累加完成
pthread_cond_signal(&cond2); // 唤醒打印线程2以结束程序
break;
}
}
return NULL;
}
void *print_thread2(void *arg) {
while (1) {
pthread_mutex_lock(&mutex); // 上锁
while (flag != 1) { // 等待条件2
pthread_cond_wait(&cond2, &mutex);
}
printf("current sum is %d\n", sum);
pthread_mutex_unlock(&mutex); // 解锁
if (sum == 5050) { // 如果累加完成
break;
}
}
return NULL;
}
int main() {
pthread_t tid1, tid2, tid3;
pthread_create(&tid1, NULL, calc_thread, NULL);
pthread_create(&tid2, NULL, print_thread1, NULL);
pthread_create(&tid3, NULL, print_thread2, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_join(tid3, NULL);
return 0;
}
```
首先定义了一个全局变量 `sum` 来记录累加和,一个互斥锁 `mutex` 来保证线程安全,还有两个条件变量 `cond1` 和 `cond2` 分别用来唤醒打印线程1和打印线程2。`flag` 是一个标记,表示当前累加出来的数是奇数还是偶数。
在计算线程中,使用互斥锁保证累加和的操作是安全的。在每次累加后,判断累加和的奇偶性,如果是偶数则设置 `flag` 为0并唤醒打印线程1,否则设置 `flag` 为1并唤醒打印线程2。
在打印线程1和打印线程2中,使用条件变量来等待计算线程的通知,如果接收到了条件变量1的通知,则输出当前累加和的值,如果接收到了条件变量2的通知,则直接结束程序(因为这时累加和已经达到了目标值)。
最后在主函数中创建线程并等待它们全部退出,程序结束。
阅读全文