理发师问题的实现
来源:互联网 发布:苹果电脑软件卸载 编辑:程序博客网 时间:2024/05/01 03:07
理发师问题:
一个理发店由一个有几张椅子的等待室和一个放有一张理发椅的理发室组成。 1. 若没有要理发的顾客,则理发师去睡觉; 2. 若一顾客进入理发店,理发师正在为别人理发,且等待室有空椅子,则该顾客就找张椅子按顺序坐下; 3. 若一顾客进入理发店,理发师在睡觉,则叫醒理发师为该顾客理发; 4. 若一顾客进入理发店且所有椅子都被占用了,则该顾客就离开。
信号量mutex用来互斥;
信号量customers用来记录等候的顾客数量,并阻塞理发师进程;
信号量barbers用来记录理发师的状态,并阻塞顾客进程。变量 wait_customer用来记录等候的顾客的数量。
代码:
# -*- coding: utf-8 -*-import threadingimport timecustomers = threading.Semaphore(0)barbers = threading.Semaphore(0)mutex = threading.Lock()wait_customer = 0CHAIRS = 5def customer(): print '... Customer''s process' global wait_customer global CHAIRS global customers,barbers,mutex time.sleep(1) mutex.acquire() if (wait_customer<CHAIRS): wait_customer+=1 print '''Customers' number is ''',wait_customer customers.release() mutex.release() barbers.acquire() else: print 'Too many customers !' mutex.release()def barber(): print '... Barber''s process' global wait_customer global CHAIRS global customers,barbers,mutex while(1): if(wait_customer==0): print 'Barber: I am sleeping now...' time.sleep(1) customers.acquire() mutex.acquire() wait_customer-=1 barbers.release() mutex.release() cut_hair()def cut_hair(): print 'Barber: I am cutting the customer''s hair...' time.sleep(2) print 'Barber: done.'if __name__ == "__main__": t1 = threading.Thread(target=barber) t1.start() t1.join(1) while(1): try: time.sleep(0.5) t2 = threading.Thread(target=customer) t2.start() t2.join(1) except Exception,e: print 'Program terminated .',e
#include <pthread.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <semaphore.h>#include <sys/time.h>#include <math.h>#define CHAIRS 5sem_t customers;sem_t barbers;pthread_mutex_t mutex;int waiting = 0;void *barber(void *arg);void *customer(void *num);void cut_hair(void);double flat(void);double normal(void);double bursty(void);int main(){ int i; pthread_t barber_t,customer_t; int error; error=pthread_create(&barber_t,NULL,barber,NULL); if(error!=0) { printf("pthread_create is not created.../n"); return -1; } while(1) { usleep(30000); error=pthread_create(&customer_t,NULL,customer,NULL); if(error!=0) { printf("pthread_create is not created...\n"); return -1; } }}void *barber(void *arg){ while(1) { sem_wait(&customers); pthread_mutex_lock(&mutex); waiting = waiting -1; sem_post(&barbers); pthread_mutex_unlock(&mutex); cut_hair(); }}void cut_hair(void){ printf(" Barber:I am cutting the customer's hair...\n"); usleep(100000); printf(" Barber:done.\n");}void *customer(void *num){ pthread_mutex_lock(&mutex); if(waiting<CHAIRS) { waiting = waiting + 1; sem_post(&customers); pthread_mutex_unlock(&mutex); sem_wait(&barbers); } else { printf(" Waiter is too much...\n"); pthread_mutex_unlock(&mutex); }}
0 0
- 理发师问题的实现
- 信号量实现理发师问题
- 嗜睡的理发师问题
- 理发师问题
- 理发师问题
- 理发师问题
- 理发师问题
- 理发师问题
- 理发师问题
- 理发师问题--windows下C++实现
- 我对理发师问题独到的理解
- 用C#模拟“嗜睡的理发师”问题
- 【OS】PV操作-理发师问题-VC++多线程模拟实现
- 进程同步的经典问题3——理发师问题
- 操作系统(三)同步进程问题--理发师的睡觉问题
- 睡眠理发师问题
- 睡眠理发师问题
- 睡眠理发师问题
- Binary Tree Level Order Traversal
- VTK 安装遇到的问题
- Linux学习笔记--newusers命令
- jQuery 遍历 - 同胞(siblings)
- jQuery 遍历- 过滤
- 理发师问题的实现
- jQuery - AJAX 简介
- 深入理解计算机系统 第1章:计算机系统漫游
- jQuery - AJAX load() 方法
- jQuery - AJAX get() 和 post() 方法
- Rocketmq-producer启动(二)
- 两篇很牛的vim使用技巧
- jQuery - noConflict() 方法
- Java的几种经典排序算法