Я кодирую симулирующую ситуацию с продажами:
Два потока продают некоторые билеты один за другим, а один поток показывает sold out
, когда количество билетов 0 .
Поэтому я пытаюсь использовать переменную условия. Вот код:
Почему переменная условия pthread не работает
int a = 10;
pthread_mutex_t mtx;
pthread_cond_t cond;
void * funca(void *p)
{
while(1)
{
pthread_mutex_lock(&mtx);
if (a == 0)
{
break;
}
a--;
pthread_mutex_unlock(&mtx);
sleep(1);
}
pthread_mutex_unlock(&mtx);
pthread_cond_broadcast(&cond);
return NULL;
}
void * funcb(void *p)
{
while(1)
{
pthread_mutex_lock(&mtx);
if (a == 0)
{
break;
}
a--;
pthread_mutex_unlock(&mtx);
sleep(1);
}
pthread_mutex_unlock(&mtx);
pthread_cond_broadcast(&cond);
return NULL;
}
void * funcc(void *p)
{
pthread_mutex_lock(&mtx);
while(a != 0)
{
pthread_cond_wait(&cond, &mtx);
printf("I'm nothing");
}
pthread_mutex_unlock(&mtx);
printf("sold out\n");
return NULL;
}
Однако, когда я выполняю код выше, я получаю бесконечный цикл со многими I'm nothing
распечатана.
Вы не инициализировали свой мьютекс и переменную условия. Используйте 'pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;' и 'pthread_cond_t cond = PTHREAD_COND_INITIALIZER;', когда вы объявляете переменные. (Также нет смысла иметь две одинаковые функции для 'funca()' и 'funcb()', вы можете просто иметь два разных потока, выполняющих одну и ту же функцию). – caf
@caf вы можете написать ответ, который я могу принять? – Yves