Pthreads Производитель-потребитель тупик
-
28-09-2019 - |
Вопрос
Я написал следующий код:
void *produce(void* arg)
{
buffer* buff = (buffer *) arg;
while (1)
{
pthread_mutex_lock(&mutex);
if (elements_produced == JOB_SIZE)
{
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
elements_produced++;
while (buff->in_buff == CAPACITY)
{
pthread_cond_wait(&cond_empty, &mutex);
}
// produce
buff->buffer[buff->tail] = rand();
sum_produced += buff->buffer[buff->tail];
printf(">produced %d\n", buff->buffer[buff->tail]);
buff->tail = (buff->tail + 1) % CAPACITY;
buff->in_buff++;
pthread_cond_signal(&cond_empty);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void *consume(void* arg)
{
int rc;
buffer* buff = (buffer *) arg;
while (1)
{
rc = pthread_mutex_lock(&mutex);
if (elements_consumed == JOB_SIZE)
{
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
return 0;
}
elements_consumed++;
while (buff->in_buff == 0)
{
rc = pthread_cond_wait(&cond_empty, &mutex);
}
// consume
printf("<consumed %d\n", buff->buffer[buff->head]);
sum_consumed += buff->buffer[buff->head];
buff->head = (buff->head + 1) % CAPACITY;
buff->in_buff--;
pthread_cond_signal(&cond_full);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
return 0;
}
Все переменные правильно инициализируются. Задача - создать элементы job_size и потреблять их. Время от времени он застрял в мертвом замке. Я вполне новый для потоков POSIX, поэтому я, наверное, скучаю с чем-то очень очевидным (много раз продюсеры / потребители в Java / C # / Python, но теперь я действительно застрял). Я знаю, что это намного легче сделать это с семафорами, но мне нужно сделать это таким образом.
Какие-либо предложения?
Решение
Вы использовали Cond_empty с обеих сторон для ожидания. Вы сигнализируете (но никогда не ждите) cond_full.
Не связан с StackOverflow