1

helgrindのツールを使用して、競合状態のアプリケーションをテストしましたValgrind。しかし、それはロックによって保護されているコードの競争を報告しました。Valgrindこれを競合状態として誤って報告しているか、何かが足りないのでしょうか。コードを以下に示します。

    pthread_mutex_lock(&G_Memory->lock_array[pb->exp_lock_index]);

    pb->subtree_cost += b->subtree_cost;
    pb->interaction_synch += 1; // <--- race here (cost_zones.c:91)

    pthread_mutex_unlock(&G_Memory->lock_array[pb->exp_lock_index]);

Valgrind/Helgrind以下を報告します

==29768== Possible data race during read of size 8 at 0x56bf8e0 by thread #4
==29768==    at 0x404C51: ComputeSubTreeCosts (cost_zones.c:91)
          ...................
==29768==  This conflicts with a previous write of size 8 by thread #1
==29768==    at 0x404C5F: ComputeSubTreeCosts (cost_zones.c:91)
          ...................
4

1 に答える 1

2

コメントで説明したことから、何かが欠けています。スレッドが異なるミューテックスを使用しているため、ここで競合状態が発生します。スレッドはここで同じミューテックスを使用する必要があります。これにより、唯一のロックを取得したときにのみコードが実行されます。

于 2013-03-06T16:46:27.550 に答える