Linux程序解决苹果橘子问题
时间: 2024-03-07 19:50:07 浏览: 178
下面是一个简单的用C语言实现的橘子苹果问题的代码,使用Linux系统的进程同步机制解决竞争问题。代码中使用了互斥锁和条件变量来实现进程之间的同步。
```
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define MAX 10
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
pthread_cond_t apple_ready = PTHREAD_COND_INITIALIZER; // 条件变量
pthread_cond_t orange_ready = PTHREAD_COND_INITIALIZER; // 条件变量
int basket = 0; // 篮子中的水果数
void *apple(void *arg)
{
int i;
for (i = 0; i < MAX; i++) {
pthread_mutex_lock(&mutex);
while (basket != 0) { // 如果篮子不为空,就等待
pthread_cond_wait(&apple_ready, &mutex);
}
basket = 1; // 将一个苹果放入篮子
printf("Put an apple into the basket.\n");
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&orange_ready); // 唤醒等待的橘子进程
}
pthread_exit(NULL);
}
void *orange(void *arg)
{
int i;
for (i = 0; i < MAX; i++) {
pthread_mutex_lock(&mutex);
while (basket != 1) { // 如果篮子不为满,就等待
pthread_cond_wait(&orange_ready, &mutex);
}
basket = 0; // 将一个橘子放入篮子
printf("Put an orange into the basket.\n");
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&apple_ready); // 唤醒等待的苹果进程
}
pthread_exit(NULL);
}
int main()
{
pthread_t tid1, tid2;
pthread_create(&tid1, NULL, apple, NULL);
pthread_create(&tid2, NULL, orange, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
```
在这个代码中,我们使用了互斥锁来保证对篮子的访问是互斥的,确保每次只有一个进程可以访问篮子。同时,使用条件变量来实现进程之间的同步。苹果进程在篮子不为空的情况下等待,等待橘子进程将橘子放入篮子并唤醒自己;橘子进程在篮子不为满的情况下等待,等待苹果进程将苹果放入篮子并唤醒自己。
注意,在代码中使用`pthread_cond_wait()`和`pthread_cond_signal()`函数时,需要先获取互斥锁,以确保操作的原子性。
阅读全文