IPC 经典问题:Sleeping Barber Problem

Posted justsong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
    }
}

以上是关于IPC 经典问题:Sleeping Barber Problem的主要内容,如果未能解决你的问题,请参考以下文章

信号量解决理发师问题(barber)

Ruby Barber | 她是凭着这些跻身柏林当红花艺师行列的

mssql 怎么杀掉 sleeping

#干货#小微信贷风控中类IPC模式和集中审批模式

ANSI C 中的双向 IPC

通过 IPC 将字符串发送到另一个应用程序