В нашем продукте есть несколько вещей (гипервизор, предназначенный для поиска ошибок параллелизма в приложениях), которые в целом полезны.Обратите внимание, что мы делаем это в самом коде (потому что это очень параллельная часть программного обеспечения) и что некоторые из них полезны независимо от того, пишете ли вы параллельный код.
Как и вы,у нас есть возможность утверждать (lock_held (...)) и использовать его.
Мы также (поскольку у нас есть свой собственный планировщик) можем утверждать (single_threaded ()) для тех (редкие) ситуации, когда мы не рассчитываем на то, что в системе нет активных потоков.
Повреждение памяти из одного потока в другой довольно распространено (и его трудно отладить), поэтому мы делаем две вещи, чтобыобратитесь к этому: разбросаны по всему стеку потоков некоторые магические куки.Мы периодически (в нашей функции get_thread_id ()) вызываем функцию «validate_thread_stack ()», которая проверяет эти куки, чтобы убедиться, что стек не поврежден.
Наш malloc вставляет магические куки до ипосле блока памяти malloc и проверяет их бесплатно.Если кто-либо выберет свои данные, они могут быть использованы для раннего обнаружения искажения.
В режиме free () мы используем в памяти хорошо известный шаблон (в нашем случае 0xdddd ...).Это приятно повреждает любого, у кого есть висячий указатель на область памяти.
У нас есть защитная страница (страница памяти, не отображенная в адресном пространстве) в нижней частистек потоков.Если поток переполняет свой стек, мы перехватываем его по ошибке страницы и заходим в наш отладчик.
Наши блокировки засвидетельствованы.Проверьте код свидетеля блокировки FreeBSD.Это так, но доморощенный.По сути, код-свидетель - это легкий способ обнаружения потенциальных взаимоблокировок, просматривая циклы на графике получения блокировки.
Наши замки также обернуты средствами доступа, которые записываютномер файла / строки приобретения и выпуска.Для двойных разблокировок или двойных блокировок вы получите довольно отладочную информацию о вашем завинчивании.
Наши замки также профилированы.Как только ваш код заработает, вы захотите, чтобы он работал хорошо.Мы отслеживаем обычные вещи, такие как, сколько приобретений, сколько времени потребовалось, чтобы приобрести его.
В нашей системе мы ожидаем, что блокировки не оспариваются (мы тщательно разработали код этогопуть).Так что, если вы ждете в нашей системе спин-блокировки более секунды или двух, вы попадете в отладчик, потому что, скорее всего, это не очень хорошая вещь.
Наши переменные, которые предназначены длябыть обновленными атомарно, обернуты внутри структуры C.Причина этого заключается в том, чтобы не допустить небрежного кода, в котором вы правильно используете: atomic_increment (& var);и плохо использовать var ++.Мы делаем очень трудным написание последнего кода.
"volatile" запрещен в нашей кодовой базе, потому что он неоднозначно реализован компиляторами.Это плохой способ попытаться объединить синхронизацию.
И конечно же отзывы кодов.Если вы не можете объяснить коллеге свои предположения о параллелизме и дисциплине блокировки, то определенно есть проблемы с кодом: -)