请用c语言实现三个线程 第一个获取输入,统计奇偶数个数,满足3个,唤醒2,3线程 第二个输出3个偶数 第三个输出3个奇数
时间: 2023-08-28 18:13:25 浏览: 97
好的,下面是使用 C 语言实现的代码:
```c
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t even_cond = PTHREAD_COND_INITIALIZER;
pthread_cond_t odd_cond = PTHREAD_COND_INITIALIZER;
int count_even = 0;
int count_odd = 0;
void* input_thread(void* arg)
{
while (1)
{
int num;
scanf("%d", &num);
pthread_mutex_lock(&mutex);
if (num % 2 == 0)
{
++count_even;
if (count_even == 3)
{
count_even = 0;
pthread_cond_broadcast(&even_cond);
}
}
else
{
++count_odd;
if (count_odd == 3)
{
count_odd = 0;
pthread_cond_broadcast(&odd_cond);
}
}
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void* output_even_thread(void* arg)
{
while (1)
{
pthread_mutex_lock(&mutex);
while (count_even != 3)
{
pthread_cond_wait(&even_cond, &mutex);
}
for (int i = 0; i < 3; ++i)
{
printf("%d ", i * 2);
}
printf("\n");
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void* output_odd_thread(void* arg)
{
while (1)
{
pthread_mutex_lock(&mutex);
while (count_odd != 3)
{
pthread_cond_wait(&odd_cond, &mutex);
}
for (int i = 0; i < 3; ++i)
{
printf("%d ", i * 2 + 1);
}
printf("\n");
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main()
{
pthread_t tid_input, tid_output_even, tid_output_odd;
pthread_create(&tid_input, NULL, input_thread, NULL);
pthread_create(&tid_output_even, NULL, output_even_thread, NULL);
pthread_create(&tid_output_odd, NULL, output_odd_thread, NULL);
pthread_join(tid_input, NULL);
pthread_join(tid_output_even, NULL);
pthread_join(tid_output_odd, NULL);
return 0;
}
```
这里使用了 POSIX 线程库来实现线程间的同步。三个线程分别是输入线程、输出偶数线程和输出奇数线程。
输入线程获取一个数字后,如果是偶数,就将 `count_even` 加 1,如果已经有 3 个偶数了,就唤醒等待偶数的输出线程;如果是奇数,则将 `count_odd` 加 1,如果已经有 3 个奇数了,就唤醒等待奇数的输出线程。注意要在修改变量之前加锁,避免并发修改导致数据不一致。
输出线程会等待条件变量,如果没有满足条件就阻塞等待,直到条件满足后才开始输出。输出完毕后释放锁,继续等待下一轮。注意要在修改变量之前加锁,避免并发修改导致数据不一致。
最后记得要调用 `pthread_join` 等待子线程结束。
阅读全文
相关推荐


















