系统调用中的信号量PV操作 理发师问题 联系客服

发布时间 : 星期二 文章系统调用中的信号量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 顾客模块

顾客模块函数流程图如下: