【设计要求】
了解信号量机制,了解并掌握进程同步和互斥机制,熟悉信号量的操作函数,利用信号量实现对共享资源的控制。编程模拟实现这一问题的程序控制,分析处理过程。
semaphore empty=2,mutex=1,apple=0,orange=0;
void father(){
do{
P(empty); //等待盘子为空
P(metux); //等待获取对盘子的操作
爸爸向盘中放一个苹果;
V(mutex); //释放对盘子的操作
V(apple); //通知女儿可以来盘子中取苹果
}while(TRUE);
}
void mather(){
do{
P(empty); //等待盘子为空
P(metux); //等待获取对盘子的操作
妈妈向盘中放一个桔子;
V(mutex); //释放对盘子的操作
V(orange); //通知儿子可以来盘子中取橘子
}while(TRUE);
}
void son1(){
do{
P(orange); //判断盘子中是否有桔子
P(metux); //等待获取对盘子的操作
儿子1取出盘中的桔子;
V(mutex); //释放对盘子的操作
V(empty); //盘子空了,可以继续放水果了
}while(TRUE);
}
void son2(){
do{
P(orange); //判断盘子中是否有桔子
P(metux); //等待获取对盘子的操作
儿子2取出盘中的桔子;
V(mutex); //释放对盘子的操作
V(empty); //盘子空了,可以继续放水果了
}while(TRUE);
}
void daugther1(){
do{
P(apple); //判断盘子中是否有苹果
P(metux); //等待获取对盘子的操作
女儿1取出盘中的苹果;
V(mutex); //释放对盘子的操作
V(empty); //盘子空了,可以继续放水果了
}while(TRUE);
}
void daugther2(){
do{
P(apple); //判断盘子中是否有苹果
P(metux); //等待获取对盘子的操作
女儿2取出盘中的苹果;
V(mutex); //释放对盘子的操作
V(empty); //盘子空了,可以继续放水果了
}while(TRUE);
}
void main() { //四个并发进程的同步执行
cobegin
father(); mather(); son();son();daugther();daugther();
coend
}
#include
#include
#include
#include
#include
#define total 2
sem_t remain, apple, orange, mutex;
static unsigned int vremain = 2, vapple = 0, vorange = 0;
void *father(void *);
void *mather(void *);
void *son1(void *);
void *son2(void *);
void *daughter1(void *);
void *daughter2(void *);
void print_sem();
int main() {
pthread_t fa, ma, so ,da;
sem_init(&remain, 0, total);//总数初始化为2
sem_init(&apple, 0, 0);//盆子中苹果数, 开始为0
sem_init(&orange, 0, 0);//盆子中梨子数, 开始为0
sem_init(&mutex, 0, 1);//互斥锁, 初始为1
pthread_create(&fa, NULL, &father, NULL);
pthread_create(&ma, NULL, &mather, NULL);
pthread_create(&so, NULL, &son1, NULL);
pthread_create(&da, NULL, &daughter1, NULL);
pthread_create(&so, NULL, &son2, NULL);
pthread_create(&da, NULL, &daughter2, NULL);
for(;;);
}
void *father(void *arg) {
while(1) {
sem_wait(&remain);
sem_wait(&mutex);
vremain--;
vapple++;
printf("父亲放苹果, 剩余空间=%u, 苹果数=%u\n", vremain, vapple);
sem_post(&mutex);
sem_post(&apple);
sleep(1);
}
}
void *mather(void *arg) {
while(1) {
sem_wait(&remain);
sem_wait(&mutex);
vremain--; vorange++;
printf("母亲放橘子, 剩余空间=%u, 橘子数=%u\n", vremain, vorange);
sem_post(&mutex);
sem_post(&orange);
sleep(2);
}
}
void *son1(void *arg) {
while(1) {
sem_wait(&orange);
sem_wait(&mutex);
vremain++; vorange--;
printf("儿子吃橘子, 剩余空间=%u, 橘子数=%u\n", vremain, vorange);
sem_post(&mutex);
sem_post(&remain);
sleep(3);
}
}
void *son2(void *arg) {
while(1) {
sem_wait(&orange);
sem_wait(&mutex);
vremain++; vorange--;
printf("儿子2吃橘子, 剩余空间=%u, 橘子数=%u\n", vremain, vorange);
sem_post(&mutex);
sem_post(&remain);
sleep(3);
}
}
void *daughter1(void *arg) {
while(1) {
sem_wait(&apple);
sem_wait(&mutex);
vremain++; vapple--;
printf("女儿1吃苹果, 剩余空间=%u, 苹果数=%u\n", vremain, vapple);
sem_post(&mutex);
sem_post(&remain);
sleep(3);
}
}
void *daughter2(void *arg) {
while(1) {
sem_wait(&apple);
sem_wait(&mutex);
vremain++; vapple--;
printf("女儿2吃苹果, 剩余空间=%u, 苹果数=%u\n", vremain, vapple);
sem_post(&mutex);
sem_post(&remain);
sleep(3);
}
}
void print_sem() {
int val1, val2, val3;
sem_getvalue(&remain, &val1);
sem_getvalue(&apple, &val2);
sem_getvalue(&orange, &val3);
printf("Semaphore: remain:%d, apple:%d, orange:%d\n", val1, val2, val3);
}