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 の内臓を掘り下げて、これを機能させる方法/可能性を理解する前に、この問題に取り組んだ (そしておそらく解決した) 人から提供された情報へのポインタを期待しています。