进程(线程)间同步互斥问题(四) 三个烟鬼问题
来源:互联网 发布:小米平板2网络模块坏 编辑:程序博客网 时间:2024/05/16 11:00
问题描述
三个烟鬼问题实际上就是线程的并发问题:
- 三个烟鬼,一个有烟草,一个有烟纸,一个有火柴
- 上帝拿走两个人的材料给一个人,那么你那个人可以抽一支烟
- 当那个人抽完这只烟的时候,上帝重新做决策
题目分析:
-其实就是有前提条件的同步问题:
- “上帝给材料才能抽烟”
- “当前抽烟的抽完上帝才能指派下一个人”
- 同时只会有一个人在抽烟
基本思路:
- 首先考虑上帝:
- 上帝指派人的时候,不能有人在抽烟,所以需要一个信号量标记是否有人在抽烟:
- 1代表当前没有人正在抽烟
- 0代表当前有人正在抽烟
- 上帝指派之后会更新一个烟鬼的信号量使它可以抽烟,然后上帝等待烟鬼抽完烟再进行重新指派
- 上帝指派人的时候,不能有人在抽烟,所以需要一个信号量标记是否有人在抽烟:
- 烟鬼要等待上帝指派,才能抽烟,所以每个烟鬼有一个信号量
- 1代表当前有权利抽烟
- 0代表还需继续等待
- 抽完烟更新smoking状态唤醒上帝
代码如下:
#include <unistd.h>#include <pthread.h>#include <semaphore.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <time.h>#define TRUE 1#define MAX 3#define p(x) sem_wait(&x)#define v(x) sem_post(&x)sem_t smoker[MAX],smoking;void init ( ){ int i; for ( i = 0 ; i < MAX ; i++ ) sem_init ( &smoker[i] , 0 , 0 ); sem_init ( &smoking , 0 , 1 );}void* _judge ( ){ while ( TRUE ) { p(smoking); int x = (rand()%MAX+MAX)%MAX; v(smoker[x]); }}void* _smoker ( void* arg ){ int *p = (int*)arg; int x = *p; while ( TRUE ) { p(smoker[x]); printf ( "%dth smoker smoking....\n" , x ); sleep(1); v(smoking); }}int main ( ){ init ( ); pthread_t sid[MAX],jid; int sid1[MAX]; int i; srand ( (unsigned)time(NULL)); pthread_create ( &jid , NULL , _judge , NULL ); for ( i = 0 ; i < MAX; i++ ) { sid1[i] = i; pthread_create ( &sid[i] , NULL , _smoker , &sid1[i] ); } for ( i = 0 ; i < MAX ; i++ ) pthread_join ( sid[i] , NULL );}
0 0
- 进程(线程)间同步互斥问题(四) 三个烟鬼问题
- 进程/线程同步、互斥、通信的问题:
- 进程(线程)间同步互斥经典问题(二)哲学家问题
- 进程(线程)间同步互斥问题(三) 熟睡的理发师问题
- 进程(线程)间的同步互斥问题(五) 读者-作者问题
- 线程之路之四:进程同步线程互斥
- 进程的同步,互斥和经典进程同步问题
- 进程-线程-同步-互斥
- 三个同步与互斥问题之哲学家就餐
- 三个同步与互斥问题之生产者与消费者
- 线程/进程同步问题
- java线程系列---关于线程同步与互斥问题
- 进程互斥问题
- 进程互斥问题
- 进程间同步互斥经典问题(一)生产者-消费者问题
- 进程同步互斥——读者写者问题
- 进程同步互斥——不死锁哲学家问题
- 进程的同步与互斥-哲学家问题
- Viewpager--无限循环新闻banner图(支持手动和自动)
- 启用Nginx目录浏览功能的方法
- Java Servlet工作原理问答
- 35 个 Java 代码性能优化总结
- 常用进程调度算法分析和求解 FCFS SJF RR 高响应比 等
- 进程(线程)间同步互斥问题(四) 三个烟鬼问题
- 喜讯:我站(yav.cc)双11活动提前来临咯
- 关于kafka中的timestamp与offset的对应关系
- C语言中对结构体赋初值
- JSP到Servlet的编译过程初探
- ubuntu 安装boost 库
- delphi property
- 仿QQ聊天(1)—无形装比,最为致命
- boost asio 应用方法学(二)——深入框架