Достаточно ли одного запуска Helgrind, чтобы гарантировать, что данная многопоточная реализация свободна от гонок данных и тупиков?

У меня многопоточная реализация, и я хотел бы протестировать ее на предмет взаимоблокировок с помощью Helgrind. Я запустил их и успешно удалил все расы данных и взаимоблокировки в соответствии с выводом, сгенерированным Helgrind. Теперь мне интересно, как Helgrind обнаруживает эти ошибки. Создает ли он все возможности из исходного кода и анализирует их на основе этих возможностей, или он основывает результат только на том конкретном экземпляре чередования времени выполнения, который он видел?


person cpp_noname    schedule 30.09.2013    source источник


Ответы (1)


По опыту я знаю, что инструмент DRD Valgrind (который похож на Helgrind) находит только ошибки, которые возникают во время выполнения, и я почти уверен, что это также верно в случае Helgrind и любого другого инструмента Valgrind.

Кроме того, создание всех возможных результатов сложной программы невозможно, особенно когда она многопоточна.

person Skaarjasaurus    schedule 30.09.2013
comment
Действительно. Helgrind пытается проверить только выполняемый код, невыполненный код не рассматривается. Тем не менее, он сообщает о возможных условиях гонки или нарушениях блокировки, даже если в данном прогоне не было никаких повреждений / повреждений. - person nos; 30.09.2013
comment
Это классическая проблема многопоточных программ, которые следуют обычной парадигме проектирования с разделяемой памятью, семафорами и т. Д. Вы не можете доказать их правильность только путем тестирования. Ваш выбор: i) доказать, что дизайн программы сам по себе правильный и что исходный код реализует дизайн; это много работы, или, ii) использовать другую многопоточную парадигму, например, взаимодействие последовательных процессов. CSP, в частности, привлекателен, потому что он эффективно гарантирует, что если у вас есть потенциал для тупика, вы столкнетесь с ним (и, таким образом, обнаружите его) при тестировании. - person bazza; 30.09.2013