2017-04-13 9 views
0

클래식 프로듀서 소비자 프로그램. 현재 대기열이 비어있는 경우 소비자 대기를 시도합니다. 큐는 메모리에있는 구조체입니다. 내 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); 
    } 
+0

뮤텍스와 조건 변수를 초기화하는 코드를 볼 수 있습니까? –

+0

... 방귀. 대기열 구조체에서 초기화되지 않았습니까? –

+0

그냥'malloc'을 호출하면됩니다. 뮤텍스와 조건 변수를 어떻게 초기화한다고 생각하십니까? –

답변

1

malloc 함수는 단지 메모리를 할당합니다. 메모리에 유효한 뮤텍스 나 조건 변수가 들어있는 것은 아닙니다. 그들을 초기화해야합니다. (또는 더 좋은 것은 아직 new과 최신 C++ 스레딩 구성을 사용하십시오.)

+0

David에게 감사드립니다. 내 초기화 함수를 추가하고 mutex를 추가하고 cond를 inits (대기열을 초기화하기 전에 main()에서 호출해야합니다). –

+1

'pthread_cond_init'은'pthread_cond_t *'를 취하고'pthread_cond_t'를 넘겨줍니다. –