2016-12-16 6 views
0

Я кодирую симулирующую ситуацию с продажами:
Два потока продают некоторые билеты один за другим, а один поток показывает 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 распечатана.

+1

Вы не инициализировали свой мьютекс и переменную условия. Используйте 'pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;' и 'pthread_cond_t cond = PTHREAD_COND_INITIALIZER;', когда вы объявляете переменные. (Также нет смысла иметь две одинаковые функции для 'funca()' и 'funcb()', вы можете просто иметь два разных потока, выполняющих одну и ту же функцию). – caf

+0

@caf вы можете написать ответ, который я могу принять? – Yves

ответ

3

Вы не инициализировали свой мьютекс и переменную условия. При объявлении переменных, использование:

pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 

Там также нет смысла иметь две идентичные функции для funca() и funcb(), вы можете просто иметь две разные нити выполняют ту же функцию.