睡觉的理发师给死锁

时间:2012-08-28 12:53:08

标签: c multithreading deadlock

我写了睡眠理发师问题的代码,看起来很奇怪...... 代码如下..

#include<stdlib.h>
#include<stdio.h>
#include<pthread.h>

#define MAX_C 10
int a[MAX_C], head=0, tail=0, tmp, tb, tc, count=1;
pthread_mutex_t B;
double time_slot[]={0.125,0.5,0.75,1.00,1.25,1.50,1.75,2.00};

void wait(int a)
{
    clock_t g=clock();
    while(((float)(clock()-g))/CLOCKS_PER_SEC != time_slot[a]);
}

void barber()
{
    printf("barber started\n");
    while(1) {
        tmp=0;
        while(head==tail) {
            printf("b\n");
        }
        tb=rand()%8;
        printf("tail:%d\n", tail);
        tail=(tail+1)%MAX_C;
        wait(tb);
    }
}

void customer()
{       
    printf("customers started\n");
    while(1) {
        wait(rand()%8);
        while((head+1)%MAX_C == tail) {
            printf("c\n");
        }
        a[head]=count-1;
        printf("head:%d\n", head);
        head=(head+1)%MAX_C;
    }
}

int main(int argc, char* argv[])
{
    pthread_t b,c;

    pthread_mutex_init(&B, NULL);
    pthread_create(&c, NULL, (void*)&customer, NULL);
    pthread_create(&b, NULL, (void*)&barber, NULL);

    pthread_join(b, NULL);
    pthread_join(c, NULL);  
    exit(0);
}

问题在于,当缓冲区已满时......理发师正在等待客户......但客户根本没有执行!!(它既没有等待也没有填充缓冲区)...因为顾客while循环没有执行...

2 个答案:

答案 0 :(得分:0)

正如Daneil Fischer所说...... while(((float)(clock()-g))/CLOCKS_PER_SEC != time_slot[a]);有一个错误我应该用

替换它
  

while(((float)(clock()-g))/CLOCKS_PER_SEC <= time_slot[a]);

但是仍然很奇怪,只有在整个缓冲区被填满之后才会出现这个'缺失'的时钟值....

答案 1 :(得分:0)

执行程序使用CPU的信号量存在问题

请查看您是否正在使用信号量。 别忘了#include

#include <unistd.h>
#include <stdlib.h>

#include <pthread.h>
#include <semaphore.h>

// The maximum number of customer threads.
#define MAX_CUSTOMERS 25
</b>

void *customer(void *number) {
    int num = *(int *)number;

    // Leave for the shop and take some random amount of
    // time to arrive.
    printf("Customer %d leaving for barber shop.\n", num);
    randwait(5);
    printf("Customer %d arrived at barber shop.\n", num);

    // Wait for space to open up in the waiting room...
    sem_wait(&waitingRoom);
    printf("Customer %d entering waiting room.\n", num);

    // Wait for the barber chair to become free.
    sem_wait(&barberChair);

    // The chair is free so give up your spot in the
    // waiting room.
    sem_post(&waitingRoom);

    // Wake up the barber...
    printf("Customer %d waking the barber.\n", num);
    sem_post(&barberPillow);

    // Wait for the barber to finish cutting your hair.
    sem_wait(&seatBelt);

    // Give up the chair.
    sem_post(&barberChair);
    printf("Customer %d leaving barber shop.\n", num);
}

void *barber(void *junk) {
    // While there are still customers to be serviced...
    // Our barber is omnicient and can tell if there are 
    // customers still on the way to his shop.
    while (!allDone) {

    // Sleep until someone arrives and wakes you..
    printf("The barber is sleeping\n");
    sem_wait(&barberPillow);

    // Skip this stuff at the end...
    if (!allDone) {

        // Take a random amount of time to cut the
        // customer's hair.
        printf("The barber is cutting hair\n");
        randwait(3);
        printf("The barber has finished cutting hair.\n");

        // Release the customer when done cutting...
        sem_post(&seatBelt);
    }
    else {
        printf("The barber is going home for the day.\n");
    }
    }
}