2011-10-15 3 views
0

POSIX 스레드를 사용하여 차단 대기열을 구현하려고한다. 중요한 코드 세그먼트는 다음과 같습니다. 이 프로그램을 실행하려고했습니다. 대기열에서 요소를 제거하려고 시도하는 스레드는 대기열에 요소가 없을 때 잠자기 상태가되고 요소를 대기열에 추가하는 신호가없는 상태에서 다시 깨어납니다 (이 결론은 모든 스레드를 시작하지 않았기 때문입니다. 요소를 큐에 추가합니다). 스레드가 다시 잠자기 상태가되어이 프로세스가 반복됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 제발 내가 여기에없는 것을 말해 주시겠습니까?내 Posix 스레드가 신호없이 깨어났다

struct rqueue 
{ 
    int qsize; 
    int capacity; 
    pthread_mutex_t lock; 
    pthread_cond_t not_empty; 
    pthread_cond_t not_full; 
}; 

remove_element_method :

pthread_mutex_lock(&rq->lock); 

    while(rq->qsize == 0){ 
     perror("Q size is zero going to sleep"); 
     pthread_cond_wait(&rq->not_empty); 
     perror("woke up"); 
    } 

// some code 
    pthread_cond_signal(&rq->not_full); 
    pthread_mutex_unlock(&rq->lock); 

add_element_method :

pthread_mutex_lock(&rq->lock); 

    if(rq->capacity != -1){ 

     while(rq->qsize == rq->capacity){ 
     pthread_cond_wait(&rq->not_full); 
     } 
    } 

    //some code 

    pthread_cond_signal(&rq->not_empty); 
    pthread_mutex_unlock(&rq->lock); 

답변

0

는 pthread_cond_wait()의 2 개의 인수를 취하는 - 두 번째는 당신이 보유하고있는 뮤텍스입니다. 당신은 단지 하나의 주장만을 전달하고 있습니다.

또한 pthread_mutex_init() 및 pthread_cond_init()를 사용하여 뮤텍스 및 조건 변수를 초기화 했습니까?

+1

또한 얼마나 자주 발생합니까? 희귀 한 경우 정상입니다. [가짜 깨우기] (http://en.wikipedia.org/wiki/Spurious_wakeup) 일 수 있습니다. – uscjeremy

+0

고마워. 나는 두 번째 주장을 잊었다. 지금 일하고있는 것 같습니다. 그러나 컴파일러는 일치하는 함수가 없다고 말해야합니까? – FourOfAKind

+1

컴파일러가 누락 된 인수를 사용하여 코드를 수락하면 거의 확실하게 (1)'pthread.h '를 포함하는 것을 잊었으며 (2) 모든 경고를 사용하지 않도록 설정했음을 의미합니다. –