信号量问题----父母子女四人吃水果
来源:互联网 发布:淘宝店铺数据包下载 编辑:程序博客网 时间:2024/05/01 03:58
问题分析:
父亲放苹果 女儿吃苹果 母亲放梨子 儿子吃梨子, 盆子最多放N个水果
mutex = 1;盆子剩下空间 = N
苹果数 = 0
梨子数 = 0
父亲: 盆子有空就放苹果.满了就不放了.
母亲: 盆子有空就放梨子.满了就不放了.
女儿: 盆子有苹果就吃, 没有就等
儿子: 盆子有梨子就吃, 没有就等
父亲: p(盆子剩下空间) p(mutex) .......... v(mutex) v(苹果数)
母亲: p(盆子剩下空间) p(mutex) .......... v(mutex) v(梨子数)
女儿: p(苹果数) p(mutex) .......... v(mutex) v(盆子剩下空间)
儿子: p(梨子数) p(mutex) .......... v(mutex) v(盆子剩下空间)
#include <stdio.h>#include <stdlib.h>#include <semaphore.h>#include <errno.h>#define total 20sem_t remain, apple, pear, mutex;static unsigned int vremain = 20, vapple = 0, vpear = 0;void *father(void *);void *mather(void *);void *son(void *);void *daughter(void *);void print_sem();int main() {pthread_t fa, ma, so, da;sem_init(&remain, 0, total);//总数初始化为20sem_init(&apple, 0, 0);//盆子中苹果数, 开始为0sem_init(&pear, 0, 0);//盆子中梨子数, 开始为0sem_init(&mutex, 0, 1);//互斥锁, 初始为1pthread_create(&fa, NULL, &father, NULL);pthread_create(&ma, NULL, &mather, NULL);pthread_create(&so, NULL, &son, NULL);pthread_create(&da, NULL, &daughter, NULL);for(;;);}void *father(void *arg) {while(1) {sem_wait(&remain);sem_wait(&mutex);printf("父亲: 放苹果之前, 剩余空间=%u, 苹果数=%u\n", 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);printf("母亲: 放梨子之前, 剩余空间=%u, 梨子数=%u\n", vremain--, vpear++);printf("母亲: 放梨子之后, 剩余空间=%u, 梨子数=%u\n", vremain, vpear);sem_post(&mutex);sem_post(&pear);sleep(2);}}void *son(void *arg) {while(1) {sem_wait(&pear);sem_wait(&mutex); printf("儿子: 吃梨子之前, 剩余空间=%u, 梨子数=%u\n", vremain++, vpear--);printf("儿子: 吃梨子之后, 剩余空间=%u, 梨子数=%u\n", vremain, vpear);sem_post(&mutex);sem_post(&remain);sleep(3);}}void *daughter(void *arg) {while(1) {sem_wait(&apple);sem_wait(&mutex);printf("女儿: 吃苹果之前, 剩余空间=%u, 苹果数=%u\n", vremain++, vapple--);printf("女儿: 吃苹果之前, 剩余空间=%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(&pear, &val3);printf("Semaphore: remain:%d, apple:%d, pear:%d\n", val1, val2, val3);}
gcc -lpthread -o 执行文件 源文件
运行结果:
父亲: 放苹果之前, 剩余空间=20, 苹果数=0
父亲: 放苹果之后, 剩余空间=19, 苹果数=1
母亲: 放梨子之前, 剩余空间=19, 梨子数=0
母亲: 放梨子之后, 剩余空间=18, 梨子数=1
儿子: 吃梨子之前, 剩余空间=18, 梨子数=1
儿子: 吃梨子之后, 剩余空间=19, 梨子数=0
女儿: 吃苹果之前, 剩余空间=19, 苹果数=1
女儿: 吃苹果之前, 剩余空间=20, 苹果数=0
父亲: 放苹果之前, 剩余空间=20, 苹果数=0
父亲: 放苹果之后, 剩余空间=19, 苹果数=1
- 信号量问题----父母子女四人吃水果
- 父母传给子女的错误理财观念
- 父母包办子女婚姻何时休
- 父母投靠子女落户(无锡)
- 父母血型与子女血型的关系
- 父母传给子女的十大错误理财观
- 根据父母计算子女身高(用方法)
- 子女
- (ZT)献给七十年代末出生正远离父母的独身子女们
- MBA中国网关注:父母该不该插手子女的MBA申请?
- 你们认为子女买房父母不帮忙是很主流很正确的吗?
- Excel图表——一图说明父母与子女的年龄是否存在“剪刀差”
- 父母性格问题
- 问题 G: 水果消除
- CVTE水果问题
- 父母
- 父母
- 父母
- 【C语言】程序结果
- 其实Unix很简单
- Putty的使用技巧
- 数组划分 求划分结果的差值
- JAX-WS 注释
- 信号量问题----父母子女四人吃水果
- 杭州规定食品企业老板考试不合格要停产-食品安全
- How to realize the UIView convert to UIImage?
- 简单二叉排序树 二叉树遍历
- Windows Phone 7开发遇到的事:解析JSON
- Workbook类提供的方法
- lua Date和Time
- Queue an action event or invoking the button action in programmatic way
- CAS 单点登陆