我正在完成我的第一个并行编程任务,并且很少知道我在整个互斥锁定情况下做了什么。
我正在尝试使用Helgrind来查找我的代码中的竞争条件,当我知道它们应该是锁定时,Helgrind会返回惊人的7300错误!但是,删除关键部分中的某些锁实际上会将我的错误减少到6000,尽管我知道这是需要锁定的区域。
可能导致这种情况的原因是什么?也许作为一般性声明,有人可以给我一个很好的资料来源,为新手解释互斥锁吗?谢谢!
答案 0 :(得分:1)
首先,Helgrind不仅检测竞赛,还检测互斥锁的误用,包括非递归互斥锁的递归锁定,解锁之前未被锁定的互斥锁等。通过删除对pthread_mutex_*
的调用,您可能只是删除了因滥用互斥API而导致的错误。 Helgrind manual page对Helgrind检测到的错误类型有广泛的描述。
其次,像Helgrind这样的动态竞争探测器因产生许多错误消息而臭名昭着 - 通常太多而无用。您应该首先使用尽可能小的代码片段来尝试它,这样您就不会被错误报告所淹没。