c - openmp c sleep 的理发师

标签 c multithreading openmp

我是 OpenMP 的新手,出于学习目的,我正在尝试实现 sleep 理发师问题。但是,我无法像我希望的那样运行代码。

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

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

最佳答案

看看这段代码:

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

如果没有空位,顾客为什么要理发? (这意味着理发店已经满了,因此,理发师正忙于照顾其他客户。) 他应该向 accessWRSeats 发出信号,离开并在其他时间重试...

关于c - openmp c sleep 的理发师,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19321057/

相关文章:

python - 将二进制数据从 Python 传递到 C API 扩展

java - 当我的所有线程在 android 中完成时,我如何执行函数?

python - multiprocessing.Queue 项目的最大大小?

c - 用于减少的 OpenMP 并行提供了错误的结果

c - 需要帮助并行化 ran2 和主程序,导致 openmp 段错误

c - 关于获取机器字的函数的奇怪问题

c - 将值插入 AVL 树

C++并行排序

java - 动态加载 GridPane 时显示 ProgressBar

c++ - OpenMP 为内联函数声明 SIMD