2015-10-05 2 views
1

Так что у меня проблемы с производителем и потребителем с 2 потоками и мьютексами. Я пытаюсь сделать, чтобы продюсер заполнил массив с 10 1. Затем потребитель потребляет каждый 1 и делает его равным 0. Это заполнение и опорожнение повторяются 10 раз. Вот то, что я до сих пор, но она застревает на первом цикле:производитель и потребитель с мьютексами и pthreading

#include <stdio.h> 
#include <pthread.h> 
#define N 10 

pthread_mutex_t mut; 
pthread_cond_t condc,condp; 
int queue[N]; 
int buffer; 

void* prod() { 
    int i; 
    for(i = 0; i<10; i++) { 
     pthread_mutex_lock(&mut); 
     while(queue[N] != 0) { 
      pthread_cond_wait(&condp, &mut); 
     } 
     int k = 0; 
     for(k=0; k<10; k++) { 
      queue[k] = 1; 
     } 

     pthread_cond_signal(&condc); 
     pthread_mutex_unlock(&mut); 
     printf("\nproduced\n"); 
    } 
    pthread_exit(0); 
} 

void* cons() { 
    int i; 
    for(i = 0; i<10; i++) { 
     pthread_mutex_lock(&mut); 
     while(queue[N] == 0) { 
      pthread_cond_wait(&condc, &mut); 
     } 
     int k = 0; 
     for(k=0; k<10; k++) { 
      queue[k] = 0; 
     } 
     pthread_cond_signal(&condp); 
     pthread_mutex_unlock(&mut); 
     printf("\nconsumed\n"); 
    } 
    pthread_exit(0); 
} 

main() { 
    pthread_t producer, consumer; 
    pthread_mutex_init(&mut, 0); 
    pthread_cond_init(&condc, 0); 
    pthread_cond_init(&condp, 0); 
    pthread_create(&consumer,NULL,&cons, NULL); 
    pthread_create(&producer,NULL,&prod, NULL); 
    pthread_join(producer,0); 
    pthread_join(consumer,0); 
    pthread_cond_destroy(&condc); 
    pthread_cond_destroy(&condp); 
    pthread_mutex_destroy(&mut); 

    return 0; 
} 
+0

Что вы подразумеваете под 'queue [N]'? –

+0

он просто заполняет массив – samuelk71

+1

Я имею в виду, почему вы получаете доступ к памяти за пределами массива? –

ответ

2

Вы не инициализировать члены queue какой-либо конкретной ценности, прежде чем вы начнете читать их. Кроме того, вы читаете queue вне диапазона - он имеет десять значений, но вы читаете одиннадцатый. Наконец, вы никогда не изменяете значение, которое вы читаете, вы устанавливаете первые десять значений, на которые вы никогда не смотрите.