2013-09-12 4 views
6

В настоящее время я работаю над большим проектом, который недавно внес много изменений, в первую очередь добавление поддержки потоков.Как написать тесты, которые проверяют условия гонки?

При просмотре кода я определил разделы, которые могут потенциально вызвать условия гонки, если не сейчас, то в будущем. Чтобы предотвратить такую ​​регрессию, я хотел бы написать тест, который может надежно обнаружить состояние гонки в этом конкретном регионе, чтобы гарантировать, что никакое будущее не приведет к этой ошибке.
Код не засорен заявлениями sleep(), но является потенциальным тупиком и миномным полем гонки, и я хочу обеспечить надежность.

Этот проект написан полностью на C. Итак, есть ли в любом случае для меня возможность писать модульные тесты для предотвращения условий гонки?

+1

Это чрезвычайно сложно сделать и сильно зависит от конкретных деталей приложения. Это также чрезвычайно сложно и часто невозможно заставить состояние гонки потерпеть неудачу в результате прямого действия. – Gray

ответ

2

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

Хотя это не решит вашу проблему, оно по крайней мере дает вам инструмент для количественной оценки степени проблемы.

Если какая-либо из расы запускается из событий вне сферы применения приложения, то любой статический анализ потребует, чтобы это также было смоделировано, чтобы иметь возможность обнаруживать условия.

0

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

0

Clang Thread Sanitizer работает, наблюдая за процессом тестирования по мере его выполнения. Всякий раз, когда поток читает или записывает память без охраны, он записывает ее, и она сообщит вам, был ли доступ к какой-либо части памяти неохраняемой более чем одним потоком.

+0

Я уже использую дезинфицирующее средство для нитей на GCC. Проблема заключается не просто в обнаружении условий гонки, а в том, чтобы воспроизвести их детерминистически. – darnir

+0

Я считаю, что вы не можете исключить условия гонки из программы. Что вы можете сделать, так это написать unittest, чтобы воспроизвести состояние гонки, обнаруженное другими средствами, и использовать его, чтобы убедиться, что вы его исключили. Но сначала вы должны начать с известного состояния гонки, вы не можете обнаружить их таким образом. В Java есть Byteman (JBoss) или Thread Weaver (Google). В C я всегда либо использовал нанослопы (сон в нужном месте значительно увеличивает вероятность возникновения гонки), либо я добавил переменные синхронизации/условия, чтобы убедиться, что у меня есть все потоки на той же самой активной операции, которую я хотел воспроизвести. – user7610

Смежные вопросы