There is also Valgrind's Helgrind tool: Helgrind: a thread error detector
Helgrind - инструмент Valgrind для обнаружения ошибок синхронизации в программах C, C ++ и Fortran, которые используют примитивы POSIX pthreads для потоковой передачи.
Основными абстракциями в POSIX pthreads являются: набор потоков, совместно использующих общее адресное пространство, создание потоков, объединение потоков, выход потока, мьютексы (блокировки), переменные условий (уведомления о событиях между потоками), блокировки чтения-записи, спин-блокировки, семафоры и барьеры.
Helgrind может обнаруживать три класса ошибок, которые подробно обсуждаются в следующих трех разделах:
<Ол>
Неправильное использование API-интерфейсов POSIX pthreads .
Потенциальные взаимоблокировки, возникающие из-за проблем с упорядочением блокировок .
Горы данных - доступ к памяти без адекватная блокировка или синхронизация .
Такие проблемы часто приводят к невоспроизводимым, зависящим от времени сбоям, взаимоблокировкам и другим проступкам, и их трудно найти другими способами.
Helgrind осознает все абстракции pthread и отслеживает их эффекты настолько точно, насколько это возможно. На платформах x86 и amd64 он понимает и частично обрабатывает неявную блокировку, возникающую из-за использования префикса инструкции LOCK.
Helgrind работает лучше всего, когда ваше приложение использует только POSIX pthreads API. Однако, если вы хотите использовать пользовательские примитивы потоков, вы можете описать их поведение для Helgrind, используя макросы ANNOTATE_ *, определенные в helgrind.h. Эта функциональность была добавлена в релиз 3.5.0 Valgrind и считается экспериментальной.