zoukankan      html  css  js  c++  java
  • IPC 经典问题:Sleeping Barber Problem

    完整代码实现:

    #include <stdio.h>
    #include <unistd.h>
    #include <time.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <semaphore.h>
    #define CUSTOMER_NUMBER 20
    void *customer(void *param);
    void *barber(void *param);
    
    int seat_num = 5;
    int interval[CUSTOMER_NUMBER] = {100, 100, 200, 100, 250, 400, 200, 100, 200, 700, 100, 200, 600, 100, 250, 400, 200, 100, 200, 700};
    
    sem_t cust_ready;
    sem_t barber_ready;
    sem_t mutex;
    
    int main(int argc, char *argv[]) {
    	pthread_t barberid;
    	pthread_t clientids[CUSTOMER_NUMBER];
        sem_init(&mutex,0,1);
        sem_init(&barber_ready,0,0);
        sem_init(&cust_ready,0,0);
        pthread_create(&barberid, NULL, barber, NULL);
        for (int i = 0; i < CUSTOMER_NUMBER; i++){
            usleep(interval[i]*1000);
            time_t t = time(NULL);
            struct tm tm = *localtime(&t);
            pthread_create(&clientids[i], NULL, customer, NULL);
            printf("%d:%d:%d: One customer comes, now there are %d seats left now
    ", tm.tm_hour, tm.tm_min, tm.tm_sec, seat_num);
        }
    }
    
    void *barber(void *param) {
        int worktime = 500;
        while(1) {
            sem_wait(&cust_ready);
            sem_wait(&mutex);
            seat_num += 1;
            time_t t = time(NULL);
            struct tm tm = *localtime(&t);
            printf("%d:%d:%d: Barber works, there are %d seats left now
    ", tm.tm_hour, tm.tm_min, tm.tm_sec, seat_num);
            usleep(worktime*1000);
            t = time(NULL);
            tm = *localtime(&t);
            printf("%d:%d:%d: Barber has cut hair, there are %d seats left now
    ", tm.tm_hour, tm.tm_min, tm.tm_sec, seat_num);
            sem_post(&barber_ready);
            sem_post(&mutex);
        }
    }
    
    void *customer(void *param) {
        sem_wait(&mutex);
        if(seat_num > 0){
            seat_num --;
            time_t t = time(NULL);
            struct tm tm = *localtime(&t);
            printf("%d:%d:%d: One customer comes, now there are %d seats left now
    ", tm.tm_hour, tm.tm_min, tm.tm_sec, seat_num);
            sem_post(&cust_ready);
            sem_post(&mutex);
            sem_wait(&barber_ready);
            t = time(NULL);
            tm = *localtime(&t);
            printf("%d:%d:%d: One customer leaves with haircut, now there are %d seats left now
    ", tm.tm_hour, tm.tm_min, tm.tm_sec, seat_num);
        } else {
            time_t t = time(NULL);
            struct tm tm = *localtime(&t);
            printf("%d:%d:%d: One customer leaves with no haircut
    ", tm.tm_hour, tm.tm_min, tm.tm_sec);
            sem_post(&mutex);
        }
    }
    
  • 相关阅读:
    javascript 常见的面试题---数组 && 算法
    JavaScript内置一些方法的实现原理--new关键字,call/apply/bind方法--实现
    javascript 数组排序原理的简单理解
    随笔2
    移动端触摸事件
    前端开发模式的思考层面
    webpack & react项目搭建一:环境
    Webpack的学习
    《Soft Skills: the software developer's life manual》
    前端路由实现
  • 原文地址:https://www.cnblogs.com/justsong/p/12219769.html
Copyright © 2011-2022 走看看