【问题标题】:openmp c sleeping barberopenmp c 睡觉理发师
【发布时间】:2013-10-11 14:46:58
【问题描述】:

我是 OpenMP 的新手,出于学习目的,我正在尝试解决睡着的理发师问题。但是,我无法按照我的意愿运行代码。

这就是我希望代码运行的方式:

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);
        }
    }
}

【问题讨论】:

  • 题外话,“删减”不是一个词。这是“剪裁”:)

标签: c multithreading openmp


【解决方案1】:

看看这段代码:

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

如果没有空位,顾客为什么要理发? (这意味着理发店已经满员,因此理发师正忙于照顾其他客户。) 他应该发信号accessWRSeats,离开,改天再试……

【讨论】:

  • 是的,你是对的,实际上他并没有剪头发,但它可以停止 while 循环。如果候车室没有座位,顾客应该离开商店。
  • 他以后不会再试一次吗?你可以让他睡觉,这样他就失去了CPU。然后他会在稍后重新获得 CPU 时再试一次。
  • 这等于顾客在街上等着,理发师对有人站在那里不感兴趣:)
  • 好吧,我同意你的看法。但我想我需要看看你的其余代码,看看我是否能发现任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
相关资源
最近更新 更多