Я не могу правильно запустить pthread с одним мьютексом и двумя условиями. Моя цель - заставить сотрудников ждать, пока магазин не станет opened_for_staff
, а после того, как он откроется, войти и реагировать на каждую staff_needed
трансляцию. Поэтому мне нужно:
opened_for_customers
- Клиент может сделать некоторую путаницу и позвонить по номеру
staff_needed
opened_for_staff
- Персонал ждет
staff_needed
- Персонал выполняет работу
Если я использую только один замок, скажем 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);
}
Как мне установить взаимные исключения и условия для достижения необходимого результата?