2012-12-22 81 views
1

您好我正在实施一个多线程程序,这就是所谓的睡理发师问题。问题是有一个理发店有N把椅子,如果没有任何顾客理发师会入睡,每当顾客进店时,理发师都会醒来,并开始切断顾客的头发。我使用条件变量而不是信号量。事情是我不能有我期望的输出。关于同步,同时实现多线程熟睡理发师

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

    #define TRUE 1 

    pthread_mutex_t mutex; 
    pthread_cond_t fill; 

    int counter; 

    int* buffer; 
    int size; 

    void* producer(void*); 
    void* consumer(void*); 

    void initialize_variables(); 
    void insert(void); 
    void remove_item(void); 

    int main(int argc, char *argv[]) { 

     int random_num; 
     int num=0; 
     pthread_t barber; 

     srand(time(NULL)); 

     if(argc!=2){ 
      printf("Not enough parameters\n"); 
      exit(0); 
     } 

     size=atoi(argv[1]); 

     initialize_variables(); 

     pthread_create(&barber,NULL,consumer,NULL); 

     while(TRUE){ 

      pthread_t customer; 
      pthread_create(&customer,NULL,producer,NULL); 

     } 

     printf("Exit the program\n"); 
     return 0; 
    } 

    void initialize_variables(){ 

     int i; 

     if(! (buffer=(int*)malloc(size*sizeof(int)))){ 
      printf("Error while allocating memory for buffer\n"); 
      exit(1); 
     } 

     for(i=0; i<size; i++) 
      buffer[i]=0; 

     pthread_mutex_init(&mutex,NULL); 

     pthread_cond_init(&empty, NULL); 
     pthread_cond_init(&fill, NULL); 

     counter = 0; 
    } 

    void* producer(void* arg){ 

    pthread_mutex_lock(&mutex); 

     while(counter==size) 
      pthread_cond_wait(&empty,&mutex); 

     printf("One Customer has arrived and sit on the #%d chair\n", counter); 
     insert(); 
     sleep(1); 
     pthread_cond_signal(&fill); 

    pthread_mutex_unlock(&mutex); 

    pthread_exit(NULL); 
} 

void* consumer(void* arg){ 

    while(TRUE){ 

     pthread_mutex_lock(&mutex); 

      while(counter==0){ 
       printf("Barber is sleeping now\n"); 
       pthread_cond_wait(&fill,&mutex); 
      } 

      remove_item(); 
      sleep(1); 
      pthread_cond_broadcast(&empty); 

     pthread_mutex_unlock(&mutex); 

    } 
} 

void insert(void){ 

    buffer[counter]=1; 
    counter++; 
} 

void remove_item(void){ 

    buffer[counter]=0; 
    printf("The barber is started to cut the hair of the customer at chair #%d\n", counter); 
    counter--; 
} 

而且,当我开始输出程序应打印"Barber is sleeping now"第一,但主线程,然后再开始运行生产线时,计数器等于零它打印"Barber is sleeping now"你能帮助我,为什么顺序错误开始?另一个问题是主线程填充整个缓冲区并开始倒计时(这指的是理发师在店铺满了之后将开始他的工作,这里是输出的一个例子,它会让你明白,并假设缓冲区大小为10

One Customer has arrived and sit on the #0 chair 
One Customer has arrived and sit on the #1 chair 
One Customer has arrived and sit on the #2 chair 
One Customer has arrived and sit on the #3 chair 
One Customer has arrived and sit on the #4 chair 
One Customer has arrived and sit on the #5 chair 
One Customer has arrived and sit on the #6 chair 
One Customer has arrived and sit on the #7 chair 
One Customer has arrived and sit on the #8 chair 
One Customer has arrived and sit on the #9 chair 
The barber is started to cut the hair of the customer at chair #10 
The barber is started to cut the hair of the customer at chair #9 
The barber is started to cut the hair of the customer at chair #8 
The barber is started to cut the hair of the customer at chair #7 
The barber is started to cut the hair of the customer at chair #6 
The barber is started to cut the hair of the customer at chair #5 
The barber is started to cut the hair of the customer at chair #4 
The barber is started to cut the hair of the customer at chair #3 
The barber is started to cut the hair of the customer at chair #2 
The barber is started to cut the hair of the customer at chair #1 
Barber is sleeping now 
One Customer has arrived and sit on the #0 chair 

我可以理解为每一个答复,并感谢反正

编辑:第一代码后不能正常工作抱歉的是,我与真正的一个更新的

回答

1

你对于哪些线程将执行的顺序,不能假定任何东西。 这是意想不到的行为,我t不确定。 如果您需要确保一个线程先于另一个线程启动。使用互斥量或信号量。

+0

是的,你是对的,但不应该是输出打印首先“理发师现在正在睡觉”因为理发线程在生产者线程之前创建? – quartaela

+0

不,这正是我写的。你可以运行profram 100次,看到有时理发师会先开始,有时它不会 – stdcall

+0

好吧,然后我明白了。感谢您的有用信息。 – quartaela