用c语言编写程序,模拟pv操作,实现题目:桌上有一只盘子,只可容纳n(0<n<5)个零食,每次只能放入或取出1个零食。爸爸向盘中放巧克力或者薯片或糖果;女儿1专等吃盘子中的糖果,女儿2专等吃盘子中的薯片,女儿3专等吃盘子中的巧克力。请用信号量和P、V操作来协调爸爸、女儿1、女儿2、女儿3之间的同步与互斥关系。
时间: 2024-03-16 13:41:34 浏览: 110
下面是使用 C 语言编写的程序,实现了题目要求的功能。在程序中,爸爸、女儿1、女儿2、女儿3都是线程,通过信号量和 P、V 操作来协调它们之间的同步和互斥关系。程序使用了 P 操作和 V 操作的函数封装,方便使用。
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#define N 3
sem_t sem_empty; // 空闲位置数量
sem_t sem_candy; // 糖果数量
sem_t sem_chip; // 薯片数量
sem_t sem_choco; // 巧克力数量
void P(sem_t *sem) {
sem_wait(sem);
}
void V(sem_t *sem) {
sem_post(sem);
}
void *dad(void *arg) {
int snack;
while (1) {
printf("请输入要放入的零食(0表示巧克力,1表示薯片,2表示糖果,-1表示退出):");
scanf("%d", &snack);
if (snack == -1) break;
P(&sem_empty); // 等待有空闲位置
if (snack == 0) {
V(&sem_choco); // 放入巧克力
} else if (snack == 1) {
V(&sem_chip); // 放入薯片
} else if (snack == 2) {
V(&sem_candy); // 放入糖果
}
printf("爸爸向盘子中放入了一个零食,盘子中还剩%d个空位\n", N - sem_empty.__align);
}
pthread_exit(NULL);
}
void *daughter1(void *arg) {
while (1) {
P(&sem_candy); // 等待有糖果
printf("女儿1拿到了一个糖果\n");
sleep(1); // 模拟吃糖果的时间
V(&sem_empty); // 释放一个空闲位置
}
pthread_exit(NULL);
}
void *daughter2(void *arg) {
while (1) {
P(&sem_chip); // 等待有薯片
printf("女儿2拿到了一个薯片\n");
sleep(1); // 模拟吃薯片的时间
V(&sem_empty); // 释放一个空闲位置
}
pthread_exit(NULL);
}
void *daughter3(void *arg) {
while (1) {
P(&sem_choco); // 等待有巧克力
printf("女儿3拿到了一个巧克力\n");
sleep(1); // 模拟吃巧克力的时间
V(&sem_empty); // 释放一个空闲位置
}
pthread_exit(NULL);
}
int main() {
pthread_t tid1, tid2, tid3, tid4;
sem_init(&sem_empty, 0, N);
sem_init(&sem_candy, 0, 0);
sem_init(&sem_chip, 0, 0);
sem_init(&sem_choco, 0, 0);
pthread_create(&tid1, NULL, dad, NULL);
pthread_create(&tid2, NULL, daughter1, NULL);
pthread_create(&tid3, NULL, daughter2, NULL);
pthread_create(&tid4, NULL, daughter3, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_join(tid3, NULL);
pthread_join(tid4, NULL);
sem_destroy(&sem_empty);
sem_destroy(&sem_candy);
sem_destroy(&sem_chip);
sem_destroy(&sem_choco);
return 0;
}
```
在程序中,使用了 `sem_init` 函数来初始化信号量,使用 `pthread_create` 函数来创建线程,使用 `pthread_join` 函数来等待线程结束,使用 `sem_destroy` 函数来销毁信号量。程序中的 `P` 函数和 `V` 函数用来封装 P 操作和 V 操作,其中 `sem_wait` 函数和 `sem_post` 函数是信号量的 P 操作和 V 操作函数。
爸爸线程会从标准输入读入一个整数,表示要放入哪种零食。然后它会等待有空闲位置,如果有空闲位置,就释放一个空闲位置,并根据输入放入对应的零食。放入零食后,它会打印一条消息,表示放入了哪种零食,并显示还有多少个空闲位置。
女儿线程会等待盘子中有对应的零食,如果有,就拿走一个,并模拟吃零食的时间。吃完后,它会释放一个空闲位置。
程序运行时,可以从标准输入输入整数来模拟爸爸向盘子中放入不同的零食。女儿线程会自动拿走对应的零食,并模拟吃零食的时间。程序会一直运行,直到爸爸线程从标准输入输入整数为-1为止。
阅读全文