Как проверить безопасность потока

Есть ли у вас какие-либо советы по тестированию многопоточного приложения?

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

Любые идеи или лучшие практики для получения высокой скорости поиска скрытых ошибок потоковой передачи?
(Я использую .Net/С#)

Ответы

Ответ 1

Вы можете использовать некоторые хорошие инструменты для проверки всех проблем с потоками, таких как расписания данных, блокировки, заторможенные потоки и т.д. intel-thread-checker - один из таких хороших инструментов.

Вы также можете попробовать CHESS от Microsoft Research

Ответ 2

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

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

Создайте тестовый документ или электронную таблицу и, используя свои знания кода, подумайте о возможных возможных условиях гонки или взаимоблокировках.

Захватите некоторых людей из зала и выполните "тест удобства пользования прихожей" (Joel on Software сказал, что я думаю?). Как правило, люди, которые не знают, что делает ваша программа /, смогут легко ее разбить.

Ответ 3

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

Возможно, вы можете посмотреть PNUnit - хотя это, вероятно, немного отличается от того, что вы ищете. Авторы говорят, что они построили его, потому что "нам нужно было моделировать сотни клиентов на одном сервере".

Ответ 4

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

Если он пройдет, разверните поиск до тех частей библиотек, которые вы используете, до тех пор, пока он не сработает или (маловероятно) проверен на потоки (то есть однопотоковый).

Как только вы знаете, что у вас есть ошибки в потоке, тестовая часть задания завершена. Все, что остается, - это маленький вопрос поиска и удаления их...