古典的なプロデューサコンシューマプログラム。現在、キューが空の場合、コンシューマーを待機させようとしています。キューはメモリ内の構造体です。私は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);
}
mutexと条件変数を初期化するコードは見えますか? –
...おなら。それはキュー構造体の初期化ではありませんか? –
'malloc'を呼び出すだけです。ミューテックスと条件変数をどのように初期化すると思いますか? –