나는 다양한 오류 검사를위한 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의 배짱에 파고 들어가서 어떻게 작동하는지 알아 내기 전에이 문제를 연구하고 해결 한 누군가가 제공 한 정보에 대한 포인터를 기대하고 있습니다.
스레드가 요소를 대기열에 넣기 전에 queue_dequeue() *를 시작하고 실행 중입니다. queue_dequeue()가 차단되지 않습니다. 그건 괜찮을거야 - dequeue 그냥 NULL을 반환해야합니다 -하지만 printf() 행복하지 않습니다. –