2017-04-13 18 views
0

古典的なプロデューサコンシューマプログラム。現在、キューが空の場合、コンシューマーを待機させようとしています。キューはメモリ内の構造体です。私はpthread_cond_wait()関数に問題があります。グローバル変数は許可されていないので、pthread_condとmutexをキュー構造体のメモリに格納しています。 pthread_cond_wait()は整数6をcondWaitCheckに返します。これは、次のいずれかが起こっていることを示します。pthread_cond_wait()は待機中ではなく、intを返します。6

[EINVAL] cond、mutex、またはabstimeで指定された値が無効です。

[EINVAL] 同じ条件変数に対してpthread_cond_wait()またはpthread_cond_timedwait()を同時に実行するために、異なるmutexが指定されていました。

[EINVAL] 呼び出し時に、現在のスレッドはmutexを所有していませんでした。

私は自分の問題であることを理解できないようです。

typedef struct queue { 
    int element[MAX_QUEUE_SIZE]; 
    int prod_id[MAX_QUEUE_SIZE]; 
    int head; 
    int tail; 
    int remaining_elements; 
    pthread_mutex_t myMutex; 
    pthread_cond_t condConsumer; 
    pthread_cond_t condProducer; 
} prod_cons_queue; 

void queue_initialize(prod_cons_queue *q){ 
    q->head = -1; 
    q->tail = -1; 
    q->remaining_elements=0; 
    pthread_cond_init (q->condConsumer,NULL); 
    pthread_cond_init (q->condProducer,NULL); 
    pthread_mutex_init (q->myMutex,NULL); 
} 

void *consumerFunc(void* prodID) { 
    int condWaitCheck; 

    pthread_mutex_lock (&(((prod_cons_queue *)prodID)->myMutex)); 

    if (((prod_cons_queue *)prodID)->remaining_elements == 0){ 
     cout << "waiting in consumer..." << endl; 
     pthread_cond_wait(&(((prod_cons_queue *)prodID)->condConsumer), &(((prod_cons_queue *)prodID)->myMutex)); 

     if (condWaitCheck!=0){ 
      cout << "There was an error on pthread_cond_wait:" << condWaitCheck << endl; 
     } 
    } 
    cout << "unlocking from consumer... " << endl; 
    pthread_mutex_unlock (&((prod_cons_queue *)prodID)->myMutex); 

    return NULL; 

} 

int main(){ 
    //Producer consumer queue initialized 
    prod_cons_queue *q = (prod_cons_queue*) malloc (sizeof(prod_cons_queue*)); 
    //q->head = 42; 

    //********************** CREATE CONSUMER ********************** 
    pthread_t consumer; 
    int conCheck; 
    conCheck = pthread_create(&consumer,NULL,&consumerFunc,(void*)q); //passing void pointer type variable q 

    if (conCheck!=0){ 
     cout << "Error:unable to create thread," << conCheck << endl; 
     //exit(-1); 
    } 
+0

mutexと条件変数を初期化するコードは見えますか? –

+0

...おなら。それはキュー構造体の初期化ではありませんか? –

+0

'malloc'を呼び出すだけです。ミューテックスと条件変数をどのように初期化すると思いますか? –

答えて

1

malloc関数はメモリを割り当てます。そのメモリに有効なmutexや条件変数が含まれないようにします。それらを初期化する必要があります。 (または、より良いことに、newと最新のC++スレッド構造を使用してください)

+0

Davidに感謝します。私は自分の初期化関数を追加し、ミューテックスとcond initsを追加しました(私はキューを初期化する前にmain()で呼び出す必要があります)。 –

+1

'pthread_cond_init'は' pthread_cond_t * 'をとり、' pthread_cond_t'を渡しています。 –

関連する問題