发布时间 : 星期二 文章系统调用中的信号量PV操作 理发师问题更新完毕开始阅读af8f18f74693daef5ef73d2c
否则只能为当前进程的所有线程共享;value给出了信号量的初始值。 (2)函数sem_post( sem_t *sem )用来增加信号量的值。
当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机制同样是由线程的调度策略决定的。
(3)函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,
解除阻塞后将sem的值减一,表明公共资源经使用后减少。函数sem_trywait ( sem_t *sem )是函数sem_wait()的非阻塞版本,它直接将信号量sem的值减一。
2.3 伪码实现
difine n 5; //为顾客准备的椅子数为5 semaphore mutex=1; //用于互斥
semaphore customers=0;//等候理发的顾客数 semaphore barbers=1;//正在等候顾客的理发师数
int waiting=0; //等候理发的顾客数 //理发师线程 void barber() {
while(true) //判断有无顾客 {
wait(customers); //若无顾客,理发师睡眠
wait(mutex); //互斥
waiting--; //等候顾客数少一个 signal(mutex); //释放临界资源
signal(barber); //理发师去为一个顾客理发 cut_hair; //正在理发
} } //顾客线程
void customer() {
wait(mutex); // if (waiting waiting++; // signal(mutex); //signal(customers); // wait(barber); // get_haircut; //} else signal(mutex); //} } 2.4 开发环境与工具 系统平台:LINUX环境 实现语言:C语言 开发工具:NANO编辑器 互斥 如果有空椅子,则等待 等候顾客数加1 释放临界资源 如果理发师睡觉,唤醒理发师理发师在理发, 顾客等候 顾客坐下等理发师 店里人满了,顾客离开 3数据结构与模块说明 3.1 数据结构 通过分析课程设计要求,定义以下的数据: sem_t mutex,customers,barbers; //design mutex,customer,barbers int waiting=0; //the number of waiting customers int chair[5]; 3.2程序模块说明 3.2.1主函数模块 主函数流程图如下: three semaphores: 3.2.2 理发师模块 理发师模块函数流程图如下: 3.2.3 顾客模块 顾客模块函数流程图如下: