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 回答