j'ai écrit le code suivant:pthreads de blocage producteur-consommateur
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;
}
Toutes les variables sont correctement initialisés. La tâche consiste à produire des éléments JOB_SIZE et à les consommer. De temps en temps, il se coince dans le verrou mort. Je suis assez nouveau sur les threads posix, donc il me manque probablement quelque chose de très évident (les producteurs/consommateurs ont plusieurs fois java/C#/python mais maintenant je suis vraiment bloqué). Je sais que c'est beaucoup plus facile de le faire avec des sémaphores, mais je dois le faire de cette façon.
Des suggestions?
Combien de condars sont impliqués? Le producteur devrait-il attendre 'cond_full' plutôt que 'cond_empty'? –