请用c语言编写这段程序,创建两个线程,一个线程从键盘输入数字,如果为奇数,唤醒另一个线程,并输出奇数的二倍,如果为偶数,继续输入,如果输入数字为99,则退出,用条件变量实现
时间: 2023-07-16 21:17:19 浏览: 38
以下是用C语言编写的程序,使用条件变量实现线程间同步:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int num = 0;
int flag = 0;
void *input_thread(void *arg) {
while (1) {
pthread_mutex_lock(&mutex);
printf("Please input a number: ");
scanf("%d", &num);
if (num == 99) {
flag = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
break;
}
if (num % 2) {
pthread_cond_signal(&cond);
pthread_cond_wait(&cond, &mutex);
}
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void *output_thread(void *arg) {
while (1) {
pthread_mutex_lock(&mutex);
if (flag) {
pthread_mutex_unlock(&mutex);
break;
}
if (num % 2 == 0) {
pthread_mutex_unlock(&mutex);
continue;
}
printf("The double of odd number is %d\n", num * 2);
pthread_cond_signal(&cond);
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t tid1, tid2;
pthread_create(&tid1, NULL, input_thread, NULL);
pthread_create(&tid2, NULL, output_thread, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
```
程序中创建了两个线程,一个是输入线程,一个是输出线程。输入线程从键盘读入一个数字,如果是奇数就唤醒输出线程,输出线程将奇数乘以二并输出,然后再等待输入线程唤醒。如果读入的数字为偶数,则输入线程继续等待输入,不唤醒输出线程。如果读入的数字为99,则程序退出。
程序中使用了条件变量实现线程间同步,输入线程和输出线程都会对条件变量进行wait和signal操作,以达到同步的目的。同时,还使用了互斥锁保护共享变量num和flag,避免多个线程同时修改导致数据出错。