2012-08-03 1 views
0

나는 다양한 오류 검사를위한 valgrind를 통합하는 툴체인에서 사용하기 위해 liblfds 라이브러리 (http://www.liblfds.org/)의 잠금이 해제 된 구조를 실험하고 있는데, 수고. 나는 라이브러리의 디버그 버전을 구축하고 다음 프로그램을 컴파일하는 데 사용 : 명령 줄에서 실행될 때valgrind를 lock-free 데이터 구조와 함께 사용하는 방법은 무엇입니까?

#include <liblfds.h> 
#include <stdio.h> 
#include <pthread.h> 

static void * 
handler(void *arg) 
{ 
    struct queue_state *queue = (struct queue_state *)arg; 
    const char *message; 
    int result = queue_dequeue(queue, (void **)&message); 
    assert(0 != result); 
    printf("%s\n", message); 
    return NULL; 
} 

int 
main(int argc, const char *argv[]) 
{ 
    struct queue_state *queue; 
    int result = queue_new(&queue, 1); 
    assert(0 != result); 
    pthread_t thread; 
    result = pthread_create(&thread, NULL, handler, queue); 
    assert(0 == result); 
    result = queue_guaranteed_enqueue(queue, (void *)"Hello lock free queue!"); 
    assert(0 != result); 
    result = pthread_join(thread, NULL); 
    assert(0 == result); 
} 

이 프로그램이 잘 실행,하지만 Valgrind의에서 실행할 때 문제가 있습니다. memcheck는 초기화되지 않은 값에 의존하는 점프를보고하며, DRD와 helgrind는 자식 스레드가 값을 큐에서 빼내려고 할 때 (queue_dequeue가 0을 반환하고 어설 션을 트립하는 경우) 프로그램이 실패하게 만듭니다. memcheck 보고서를 해결할 수는 있지만 DRD 및 helgrind 충돌은 막연한 현상입니다.

클라이언트 요청 매크로 중 일부를 삽입해야하지만 스레드 오류 검사기 매크로에 대한 설명서는 pthread 및 메모리 처리 이외의 뮤텍스 구조를 지향합니다. 커스텀 할당 자로부터. 나는 valgrind의 배짱에 파고 들어가서 어떻게 작동하는지 알아 내기 전에이 문제를 연구하고 해결 한 누군가가 제공 한 정보에 대한 포인터를 기대하고 있습니다.

+0

스레드가 요소를 대기열에 넣기 전에 queue_dequeue() *를 시작하고 실행 중입니다. queue_dequeue()가 차단되지 않습니다. 그건 괜찮을거야 - dequeue 그냥 NULL을 반환해야합니다 -하지만 printf() 행복하지 않습니다. –

답변

0

당신은 항상 당신의 경험 예기치 않은, 내가 Valgrind의 경고없이 릴리스 6을 통과, 알고

마지막 :-) 사이트 포럼에 라이브러리 저자에게 문의 할 수있다.

저에게 이메일을 보내주세요. liblfds dot org에서 admim을 보내주십시오.