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);
또한 얼마나 자주 발생합니까? 희귀 한 경우 정상입니다. [가짜 깨우기] (http://en.wikipedia.org/wiki/Spurious_wakeup) 일 수 있습니다. – uscjeremy
고마워. 나는 두 번째 주장을 잊었다. 지금 일하고있는 것 같습니다. 그러나 컴파일러는 일치하는 함수가 없다고 말해야합니까? – FourOfAKind
컴파일러가 누락 된 인수를 사용하여 코드를 수락하면 거의 확실하게 (1)'pthread.h '를 포함하는 것을 잊었으며 (2) 모든 경고를 사용하지 않도록 설정했음을 의미합니다. –