我是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);
}
}
}
題外話,「cutted」isn'一個字。這是「切」:) –