Мутекс pthread с двумя условиями - PullRequest
0 голосов
/ 18 октября 2019

Я не могу правильно запустить pthread с одним мьютексом и двумя условиями. Моя цель - заставить сотрудников ждать, пока магазин не станет opened_for_staff, а после того, как он откроется, войти и реагировать на каждую staff_needed трансляцию. Поэтому мне нужно:

  1. opened_for_customers
  2. Клиент может сделать некоторую путаницу и позвонить по номеру staff_needed
  3. opened_for_staff
  4. Персонал ждет staff_needed
  5. Персонал выполняет работу

Если я использую только один замок, скажем staff_needed как в owner, так и в leave тогда клиенты могут позвонить персоналу, и он среагирует до того, как owner откроет для них магазин.

void* owner(void* par)
{
  pthread_mutex_lock(&owner);

  pthread_cond_broadcast(&opened_for_customers);


  coffeeBreak();

  pthread_cond_broadcast(&opened_for_staff);


  pthread_mutex_unlock(&owner);

  return NULL;

}

void leave(Customer* customer, Toilet* toilet)
{
  pthread_mutex_lock(&leaving_the_cabin);
 ...
  else
  {
    printf("Customer %zd is a pig :-(\n", customer->customer_number);
    pthread_cond_broadcast(&staff_needed);
  }

  pthread_mutex_unlock(&leaving_the_cabin);
  pthread_exit(NULL);
}



void* clean_it(void* cleaningStaff)
{

  pthread_mutex_lock(&cleaner);

...

  while (1)
  {
    pthread_cond_wait(&opened_for_staff, &cleaner);
    pthread_cond_wait(&staff_needed, &cleaner);
    printf("Cleaning staff %zd is looking for a toilet to be cleaned...\n", id);

...
  }
  pthread_mutex_unlock(&cleaner);
  pthread_exit(NULL);
}

Как мне установить взаимные исключения и условия для достижения необходимого результата?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...