我在liblfds库(http://www.liblfds.org/)中尝试使用无锁结构,着眼于在工具链中使用它们,这些工具链还包含valgrind用于各种错误检查,这导致我有些麻烦。我构建了一个库的调试版本,并用它来编译以下程序:
#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 :(得分:0)
您可以随时在网站论坛上询问图书馆作者: - )
最后我知道,valgrind在没有任何警告的情况下通过了第6版,所以你的经历出乎意料。
给我发一封电子邮件 - 在liblfds dot org上欣赏。