Методы отладки мультипотока

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

Конкретный .NET, или универсальный.

6
задан Mau 5 July 2010 в 13:02
поделиться

4 ответа

Мне не известны статьи или книги, посвященные тому, что вы ищете, поэтому вот мои «уроки, извлеченные» из 12 лет многопоточной отладки в Windows (как неуправляемой, так и управляемой).

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

Тупиковые ситуации и поврежденное общее состояние

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

(Примечание: приведенная выше ссылка на «иерархии блокировок» относится к статье доктора Доббса, написанной Хербом Саттером; он написал целую серию статей Эффективный параллелизм , которые я настоятельно рекомендую).

Подробнее о взаимоблокировках

Используйте RAII для всей синхронизации . Это гарантирует, что блокировки снимаются при возникновении исключений. Предпочитайте оператор "lock", чтобы попытаться / наконец.

(Обратите внимание, что RAII в .NET зависит от IDisposable , а не от Finalize , и предполагает, что клиентский код будет правильно использовать с блоком ).

Starvation

Удалите любые модификации приоритетов потоков. Правильная расстановка приоритетов на самом деле немного противоречит интуиции: лучше всего дать потоку с наибольшим объемом работы, чтобы он выполнял более низкий приоритет, и дать более высокий приоритет потокам, которые связаны с вводом-выводом (включая поток пользовательского интерфейса). Поскольку Windows делает это автоматически (см. Внутреннее устройство Windows ), код вообще не должен вмешиваться.

Общие

Удалите весь свободный от блокировки код, написанный собственными силами. Он почти наверняка содержит небольшие ошибки. Замените его .NET 4 коллекциями без блокировок и объектами синхронизации или измените код на блокировку.

Используйте концепции более высокого уровня для синхронизации. Параллельная библиотека задач и унифицированная отмена в .NET 4 практически исключают необходимость прямого использования ManualResetEvent , Monitor , ] Семафор и т. Д.

Используйте концепции более высокого уровня для распараллеливания. TPL и PLINQ в .NET 4 имеют встроенные алгоритмы самобалансировки с интеллектуальным секционированием и очередями с перехватом работы для автоматического обеспечения оптимального распараллеливания. В тех немногих редких случаях, когда автоматическое распараллеливание не является оптимальным, и TPL, и PLINQ предоставляют огромное количество настраиваемых регуляторов (настраиваемые схемы разделения, флаги длительных операций и т. Д.).

Есть еще один прием, который я нашел полезным для любого класса, методы которого вызываются разными потоками: документ, какие методы выполняются в каких потоках. Обычно это добавляется как комментарий вверху метода. Убедитесь, что каждый метод работает только в известном контексте потока (например, «в потоке пользовательского интерфейса», «в потоке ThreadPool» или «в выделенном фоновом потоке»). Ни один из методов не должен говорить «в любом потоке», если вы не пишете класс синхронизации (и если вы пишете класс синхронизации, спросите себя, действительно ли вам следует это делать).

Наконец, назовите свои обсуждения.Это помогает легко различать их при использовании отладчика VS. .NET поддерживает это через свойство Thread.Name .

11
ответ дан 8 December 2019 в 12:57
поделиться

Не то, о чем вы просите, но, возможно, вы найдете ШАХМАТЫ интересными.

6
ответ дан 8 December 2019 в 12:57
поделиться

Вы также можете взглянуть на Intel Thread Checker или Thread Profiler и Sun's Studio Thread Analyzer , хотя они не бесплатно. Также ознакомьтесь с этой статьей Intel.

1
ответ дан 8 December 2019 в 12:57
поделиться

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

  1. Неправильное использование POSIX pthreads API.
  2. Возможные взаимоблокировки, возникающие из-за проблем с упорядочением блокировок.
  3. Гонки данных - доступ к памяти без адекватной блокировки или синхронизации.

http://valgrind.org/docs/manual/hg-manual.html

Очевидно, единственный инструмент Linux для системных программ, C / C ++. Ни Java, ни .NET.

0
ответ дан 8 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: