Редактировать Я почему-то упустил, что вы упомянули Helgrind.Однако в моем тексте есть указания на то, почему helgrind может пропустить такие случаи.
Вы можете использовать helgrind из инструментария valgrind
Helgrind - это инструмент Valgrind для обнаружения ошибок синхронизации в программах на C, C ++ и Fortran, использующих потоковые примитивы POSIX pthreads.
Основные абстракции в pthreads POSIX: набор потоков, разделяющих общее адресное пространство, потоксоздание, присоединение к потоку, выход из потока, мьютексы (блокировки), условные переменные (уведомления о событиях между потоками), блокировки чтения-записи, спин-блокировки, семафоры и барьеры.
Helgrind может обнаруживать три класса ошибок, которые:подробно обсуждается в следующих трех разделах:
Неправильное использование API pthreads POSIX .
Потенциалвзаимоблокировки, возникающие из-за проблем с порядком блокировки .
Гонки данных - доступ к памяти без адекватной блокировки или синхронизации .
Подобные проблемы часто приводят к невоспроизводимым, зависящим от времени сбоям, взаимоблокировкам и другим нарушениям, и их трудно найти другими способами.
Helgrindзнает обо всех абстракциях pthread и отслеживает их эффекты настолько точно, насколько это возможно.На платформах x86 и amd64 он понимает и частично обрабатывает неявную блокировку, возникающую из-за использования префикса инструкции LOCK.
Helgrind работает лучше всего, когда ваше приложение использует только POSIX pthreads API.Однако, если вы хотите использовать пользовательские потоковые примитивы, вы можете описать их поведение в Helgrind с помощью макросов ANNOTATE_ *, определенных в helgrind.h.Эта функциональность была добавлена в выпуске 3.5.0 Valgrind и считается экспериментальной.