클래식 프로듀서 소비자 프로그램. 현재 대기열이 비어있는 경우 소비자 대기를 시도합니다. 큐는 메모리에있는 구조체입니다. 내 pthread_cond_wait() 함수에 문제가 있습니다. 전역 변수는 허용되지 않으므로 pthread_cond와 뮤텍스를 큐 구조체의 메모리에 저장합니다. pthread_cond_wait()는 정수 6을 condWaitCheck에 반환하는데, 이는 다음 중 하나가 발생했음을 나타냅니다.pthread_cond_wait() 대기 중, int 반환 6
[EINVAL] cond, mutex 또는 abstime으로 지정된 값이 유효하지 않습니다.
[EINVAL] 동일한 조건 변수에 대해 동시 pthread_cond_wait() 또는 pthread_cond_timedwait() 연산에 다른 뮤텍스가 제공되었습니다.
[EINVAL] 호출시 뮤텍스가 현재 스레드에서 소유하지 않았습니다.
그리고 어떤 것이 내 문제인지 파악할 수 없습니다.
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);
}
뮤텍스와 조건 변수를 초기화하는 코드를 볼 수 있습니까? –
... 방귀. 대기열 구조체에서 초기화되지 않았습니까? –
그냥'malloc'을 호출하면됩니다. 뮤텍스와 조건 변수를 어떻게 초기화한다고 생각하십니까? –