如何使用valgrind与无锁数据结构?

时间:2012-08-03 21:28:39

标签: valgrind lock-free

我在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的内容以确定如何使这个问题成为可行之前,找到一个已经处理过(并且可能已经解决)这个问题的人提供的信息的指针。

1 个答案:

答案 0 :(得分:0)

您可以随时在网站论坛上询问图书馆作者: - )

最后我知道,valgrind在没有任何警告的情况下通过了第6版,所以你的经历出乎意料。

给我发一封电子邮件 - 在liblfds dot org上欣赏。