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

2026/1/27 20:20:56

否则只能为当前进程的所有线程共享;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 顾客模块

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


系统调用中的信号量PV操作 理发师问题.doc 将本文的Word文档下载到电脑
搜索更多关于: 系统调用中的信号量PV操作 理发师问题 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219