我用Valgrind
的helgrind
工具测试了一个应用程序的竞态条件。但是它报告了一个由锁保护的代码的竞争。是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)
...................
从你在评论中的描述来看,你遗漏了一些东西。这里有一个竞争条件,因为线程使用不同的互斥锁。您的线程必须在这里使用相同的互斥锁,以便代码仅在获得唯一的锁时执行。