主线程每秒输出依次偶数0,2,4,8等偶数,另外一个线程每秒一次输出1、2、3、5等奇数,并且通过同步方法实现总的输出结果为 0、1、2、3、4按大小顺序一次输出。(提示:可以使用互斥锁实现同步)
时间: 2023-12-28 18:17:54 浏览: 67
以下是使用 POSIX 线程库实现主线程和子线程交替输出偶数和奇数,并通过互斥锁实现同步的示例代码:
```c
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 初始化互斥锁
int count = 0; // 打印计数器
void *print_odd(void *arg) {
while (count <= 5) {
pthread_mutex_lock(&mutex); // 加锁
if (count % 2 == 1) { // 判断是否为奇数
printf("%d ", count);
count++;
}
pthread_mutex_unlock(&mutex); // 解锁
sleep(1);
}
pthread_exit(NULL);
}
int main() {
pthread_t tid;
pthread_create(&tid, NULL, print_odd, NULL); // 创建奇数线程
for (int i = 0; i <= 5; i += 2) {
pthread_mutex_lock(&mutex); // 加锁
while (count % 2 == 1) { // 判断是否为奇数
pthread_mutex_unlock(&mutex); // 解锁
sleep(1);
pthread_mutex_lock(&mutex); // 加锁
}
printf("%d ", count);
count++;
pthread_mutex_unlock(&mutex); // 解锁
sleep(1);
}
pthread_join(tid, NULL); // 等待线程结束
pthread_mutex_destroy(&mutex); // 销毁互斥锁
return 0;
}
```
在上述代码中,我们通过互斥锁实现了主线程和子线程的同步。主线程每秒输出一个偶数,如果当前的计数器 `count` 为奇数,则等待子线程输出一个奇数后再继续输出偶数,否则直接输出偶数并将 `count` 加 1。子线程每秒输出一个奇数,如果当前的 `count` 为奇数,则直接输出奇数并将 `count` 加 1,否则等待主线程输出一个偶数后再继续输出奇数。最终输出结果为 0、1、2、3、4 按大小顺序一次输出。
需要注意的是,在主线程输出偶数时,需要使用一个循环判断当前的 `count` 是否为奇数,如果是则等待子线程输出一个奇数后再继续输出偶数。这是因为如果主线程直接输出偶数,可能会导致输出结果错乱。
阅读全文