程序中创建2个子线程。子线程1代表父亲,循环10次输出“Put”表示放10次苹果。子线程2代表儿子,循环10次输出“Eat”表示取出苹果吃10次。要求父亲放一次苹果,儿子吃一次苹果,交替进行。即“Put”和“Eat”交替输出
时间: 2023-06-04 14:04:06 浏览: 116
两个线程交替执行
4星 · 用户满意度95%
好的,这是一个经典的线程控制问题。以下是代码实现:
```
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mutex;
pthread_cond_t cond_father, cond_son;
int count = 0;
void *father_thread(void *arg)
{
for (int i = 0; i < 10; i++)
{
pthread_mutex_lock(&mutex); //加锁
while (count % 2 != 0) //如果是儿子的回合,父亲需要等待
{
pthread_cond_wait(&cond_father, &mutex);
}
printf("Put\n");
count++;
pthread_cond_signal(&cond_son); //通知儿子可以开始吃苹果了
pthread_mutex_unlock(&mutex); //解锁
}
return NULL;
}
void *son_thread(void *arg)
{
for (int i = 0; i < 10; i++)
{
pthread_mutex_lock(&mutex); //加锁
while (count % 2 != 1) //如果是父亲的回合,儿子需要等待
{
pthread_cond_wait(&cond_son, &mutex);
}
printf("Eat\n");
count++;
pthread_cond_signal(&cond_father); //通知父亲可以开始放苹果了
pthread_mutex_unlock(&mutex); //解锁
}
return NULL;
}
int main()
{
pthread_t father, son;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond_father, NULL);
pthread_cond_init(&cond_son, NULL);
pthread_create(&father, NULL, father_thread, NULL);
pthread_create(&son, NULL, son_thread, NULL);
pthread_join(father, NULL);
pthread_join(son, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond_father);
pthread_cond_destroy(&cond_son);
return 0;
}
```
我们使用了一个计数器 `count` 来记录当前到了哪个回合,使用互斥锁 `mutex` 来保证在修改计数器的时候不会出现竞态问题。使用条件变量 `cond_father` 和 `cond_son` 来实现线程之间的协调。
当父亲线程 `father_thread` 执行时,会首先尝试加锁互斥锁 `mutex`,然后检查当前是否是父亲的回合(即计数器 `count` 是否为偶数)。如果不是父亲回合,父亲需要将自己等待在条件变量 `cond_father` 上,阻塞等待儿子线程唤醒。如果是父亲回合,父亲线程将输出一次“Put”,将计数器 `count` 加 1,然后使用条件变量 `cond_son` 通知儿子线程可以开始吃苹果了,最后解锁互斥锁。
类似的,当儿子线程 `son_thread` 执行时,会首先尝试加锁互斥锁 `mutex`,然后检查当前是否是儿子的回合(即计数器 `count` 是否为奇数)。如果不是儿子回合,儿子需要将自己等待在条件变量 `cond_son` 上,阻塞等待父亲线程唤醒。如果是儿子回合,儿子线程将输出一次“Eat”,将计数器 `count` 加 1,然后使用条件变量 `cond_father` 通知父亲线程可以开始放苹果了,最后解锁互斥锁。
这样就实现了“Put”和“Eat”交替输出的效果。
阅读全文