编写一个2线程程序:主线程每秒输出依次偶数0,2,4,8等偶数,另外一个线程每秒一次输出1、2、3、5等奇数,并且通过同步方法实现总的输出结果为 0、1、2、3、4按大小顺序一次输出。(提示:可以使用互斥锁实现同步)
时间: 2024-03-23 18:41:19 浏览: 111
好的,以下是一个可能的实现:
```c
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t lock;
int even_num = 0;
int odd_num = 1;
void *print_even(void *arg) {
while (even_num <= 4) {
pthread_mutex_lock(&lock);
if (even_num % 2 == 0) {
printf("%d ", even_num);
even_num++;
}
pthread_mutex_unlock(&lock);
usleep(1000000);
}
pthread_exit(NULL);
}
void *print_odd(void *arg) {
while (odd_num <= 5) {
pthread_mutex_lock(&lock);
if (odd_num % 2 == 1) {
printf("%d ", odd_num);
odd_num++;
}
pthread_mutex_unlock(&lock);
usleep(1000000);
}
pthread_exit(NULL);
}
int main() {
pthread_t even_tid, odd_tid;
pthread_mutex_init(&lock, NULL);
pthread_create(&even_tid, NULL, print_even, NULL);
pthread_create(&odd_tid, NULL, print_odd, NULL);
pthread_join(even_tid, NULL);
pthread_join(odd_tid, NULL);
pthread_mutex_destroy(&lock);
printf("\n");
return 0;
}
```
在这个实现中,我们定义了两个线程:`print_even` 和 `print_odd`,分别用于输出偶数和奇数。这两个线程都会在一个互斥锁上等待,以确保它们交替输出数字。
`even_num` 和 `odd_num` 分别跟踪下一个要输出的偶数和奇数。在每个线程中,我们首先获得锁,然后检查下一个要输出的数字是否是该线程应该输出的类型(偶数或奇数)。如果是,我们输出数字并将相应的计数器增加1。最后,我们释放锁并让线程休眠1秒钟,以便让另一个线程有机会运行。
在主函数中,我们初始化互斥锁,创建两个线程,等待它们完成,然后销毁锁。最后,我们输出一个换行符以确保输出在一行结束。
阅读全文