2013-10-11 32 views
2

我是OpenMP的新手,爲了學習的目的,我試圖實現睡眠理髮師問題。但是,我無法按照我的意願將代碼運行得太快。openmp c熟睡的理髮師

這是我想的代碼運行:

Creating customer 0 
Creating customer 1 
Creating customer 2 
Creating customer 3 
Creating customer 4 
Sleeping 
Customer: 3 waiting for seats 
Customer: 3 ready, waiting for barber 
Customer: 1 waiting for seats 
Customer: 1 ready, waiting for barber 
Customer: 2 waiting for seats 
Customer: 2 ready, waiting for barber 
Customer: 4 waiting for seats 
Customer: 4 ready, waiting for barber 
Customer: 0 waiting for seats 
Customer: 0 ready, waiting for barber 
Barber: waiting for customer 
Barber: waiting for seats 
Customer: 2 is done. Leaving.. 
Number of customers hair cutted: 1 
Barber: waiting for customer 
Barber: waiting for seats 
Customer: 1 is done. Leaving.. 

但是這是怎麼了實際運行:

Creating customer 0 
Creating customer 1 
Creating customer 2 
Creating customer 3 
Creating customer 4 
Customer: 0 waiting for seats 
Customer: 0 ready, waiting for barber 
Barber: waiting for customer 
Barber: waiting for seats 
Customer: 0 is done. Leaving.. 
Customer: 1 waiting for seats 
Customer: 1 ready, waiting for barber 
Number of customers hair cutted: 1 
Barber: waiting for customer 
Barber: waiting for seats 
Customer: 1 is done. Leaving.. 
Customer: 2 waiting for seats 
Customer: 2 ready, waiting for barber 
Number of customers hair cutted: 2 
Barber: waiting for customer 
etc.. 

正如你所看到的,它就像只有一個客戶在一個時間正在等待信號量,他們以某種方式等待其他客戶任務完成。

代碼:

void customer(int threadid) 
{ 
    int hairCutted = 0; 
    while (!hairCutted) { 
     printf("Customer: %ld waiting for seats\n", (long)threadid); 
     sem_wait(&accessWRSeats); 
     if (numOfFreeSeats >0) { 
      numOfFreeSeats--; 
      sem_post(&custReady); 
      sem_post(&accessWRSeats); 
      printf("Customer: %ld ready, waiting for barber\n", (long)threadid); 
      sem_wait(&barberReady); 
      hairCutted = 1; 
     } 
     else { 
      sem_post(&accessWRSeats); 
      hairCutted = 1; 
     } 
    } 

    printf("Customer: %ld is done. Leaving..\n", (long)threadid); 
} 


void createCustomers(void) 
{ 
    int i;  

    printf("Random number: %d\n", randNum1); 

    #pragma omp parallel 
    { 
     #pragma omp single firstprivate(i) 
     for (i = 0; i < randNum1; ++i) 
     { 
      #pragma omp task 
      customer(i); 
      printf("Creating customer %d\n", i); 
     } 
    } 

    printf("Sleeping\n"); 
    sleep(60); 
    int j; 
    printf("Random number: %d\n", randNum2); 
    #pragma omp parallel 
    { 
     #pragma omp single firstprivate(i) 
     for (j = 0; j < randNum2; ++j, ++i) 
     { 
      #pragma omp task 
      customer(i); 
      printf("Creating customer %d\n", i); 
     } 
    } 
} 
+0

題外話,「cutted」isn'一個字。這是「切」:) –

回答

0

看看這段代碼:

sem_wait(&accessWRSeats); 
if (numOfFreeSeats >0) 
{ 
    ... 
} 
else 
{ 
    sem_post(&accessWRSeats); 
    hairCutted = 1; 
} 

爲什麼客戶得到一個理髮如果沒有免費座位給他坐? (這意味着理髮店已滿,因此,理髮師正忙於參加其他客戶。) 他應該發信號accessWRSeats,請稍後再試一次...

+0

是的,你是對的,實際上他沒有得到他的頭髮切割,但它在那裏停止while循環。如果候車室沒有座位,客戶應該離開商店。 – KLIM8D

+0

以後不會再試一次嗎?你可以讓他睡覺,所以他會失去CPU。然後當他再次得到CPU時他會再試一次。 – fvdalcin

+0

這將等於客戶在街上等待,理髮師不感興趣有人站在那裏:) – KLIM8D