2012-08-25 4 views
0

스레드를 사용하는 것이 처음이므로 스레드와 함께 작동하는 큐를 작성하는 것이 좋습니다. 그러나 뭔가 잘못되었습니다, 나는 소비자 스레드가 동일한 데이터 또는 뭔가에 액세스하려고 의심합니다. 내가 뮤텍스를 사용하지만 나는 아마 내가이 오류 (거의 모든 세번째 실행)을 얻을 뭔가 ...pthread queue in c

을 오해했습니다

*** glibc detected *** ./t_queue_test: double free or corruption (fasttop): 0x0000000002114610 ***

코드는 다소 긴 그래서 페이스트 빈에이를 게시 한되고, 하지만 그게 잘못된 경우 여기에 붙여 넣을 수 있습니다.

t_queue.h ->http://pastebin.com/2KYmujeE

t_queue.c ->http://pastebin.com/1wZPMwDB

t_queue_test.c ->http://pastebin.com/QKCTQWaf

나는 오류가 'get_q'기능에 occures, 내가 표시 한 생각

코드에서.

어떤 조언이나 제안에 감사드립니다. 나는 유사한 질문을 stackoverflow 주위에 파고, 그리고 좀 더 발굴합니다! Valgrind는 아직 아무것도 표시하지 않습니다.

+3

마지막 요소를 "가져 오는"경우에는 "뒤"를 매달려있는 포인터로 남겨 두는 것 같습니다. –

+0

아, 그 부분을 살펴 보겠습니다. – jgr

+0

대기열에 액세스하는 모든 스레드가 존재하는 한 안전하게 전체 대기열을 차단할 수는 없습니다. del_q가 뮤텍스를 잠그는 것이 어쨌든 도움이되지 않는다면, 큐에 접근하는 다른 모든 쓰레드가 종료 될 때까지는 del_q 연산을 호출 할 수 없다. –

답변

1

나중에 페이스트 인이 사라질 경우를 대비해 메모 해 주시기 바랍니다. 오류 코드는 다음과 같습니다. 마지막 요소가 제거되면

if(q->rear != NULL && q->front != NULL) 
{ 
    node_n = q->front; 
    *d = node_n->data; 
    q->front = node_n->next; 
    free(node_n);   
} 

그것은 꽤 괜찮 전면을 정리하지만, 뒷면은 비어있는 큐를 반영하기 위해 업데이트해야합니다. 예를 들어 이렇게하면됩니다.

if(q->rear != NULL && q->front != NULL) 
{ 
    node_n = q->front; 
    *d = node_n->data; 
    q->front = node_n->next; 
    if(q->front == NULL) 
     q->rear = NULL; 
    free(node_n); 
}