Похоже, Valgrind имеет два инструмента, которые оба обнаруживают ошибки потоков: Helgrind и ] DRD . Эти инструменты в основном похожи.
Мой основной вопрос: когда я должен использовать один вместо другого для проверки моего многопоточного кода?
В более широком смысле, почему существует два инструмента? Я предполагаю, что они не полностью избыточны. Какие важные отличия? Стоит ли мне вообще планировать запуск кода с помощью обоих инструментов?
Если вы используете какие-либо примитивы синхронизации POSIX, кроме мьютексов (например, семафоры, барьеры, условные переменные и т. Д.), DRD стоит того, чтобы его использовать - он может выявить некоторые тонкие злоупотребления, которые Хелгринд не обнаруживает.
Тем не менее, DRD кажется намного более ресурсоемким, чем Helgrind (в моих прогонах, использующих 3.14.0, кажется, что загрузка ЦП огромна).
Еще один момент, на который следует обратить внимание: в версии valgrind 3.6.0 DRD поддерживает спин-блокировки pthread, а helgrind - нет. Я не пробовал 3.7.0, но заметки о выпуске заставляют меня поверить, что это не изменилось.