Защитные сети в сложном многопоточном коде? - PullRequest
4 голосов
/ 07 января 2010

Как разработчик, который только что закончил писать тысячи строк сложного многопоточного кода на языке C в проекте и который будет улучшен, изменен и т. Д. Несколькими другими разработчиками, незнакомыми с этим кодом в будущем, Я хотел выяснить, какие сети безопасности вы, ребята, пытаетесь вставить в такой код? В качестве примера я мог бы сделать это:

  1. Определение макросов доступа для защищенной блокировки члены структуры, которые утверждают, что соответствующий замок удерживается. это проясняет, что эти члены Защищены замком для всех, кто не знаком с этим кодом.
  2. Функции, которые должны быть звонил с какой-то спинлок утверждают, что спин-блокировка удерживается.

Какие защитные сети вы вложили в написанный вами многопоточный код?
С какими проблемами вы столкнулись, когда другие разработчики модифицировали такой код?
Какие средства отладки вы вставили в такой код?

Спасибо за ваши комментарии.

Ответы [ 3 ]

6 голосов
/ 07 января 2010

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

  • Как и вы,у нас есть возможность утверждать (lock_held (...)) и использовать его.

  • Мы также (поскольку у нас есть свой собственный планировщик) можем утверждать (single_threaded ()) для тех (редкие) ситуации, когда мы не рассчитываем на то, что в системе нет активных потоков.

  • Повреждение памяти из одного потока в другой довольно распространено (и его трудно отладить), поэтому мы делаем две вещи, чтобыобратитесь к этому: разбросаны по всему стеку потоков некоторые магические куки.Мы периодически (в нашей функции get_thread_id ()) вызываем функцию «validate_thread_stack ()», которая проверяет эти куки, чтобы убедиться, что стек не поврежден.

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

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

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

  • Наши блокировки засвидетельствованы.Проверьте код свидетеля блокировки FreeBSD.Это так, но доморощенный.По сути, код-свидетель - это легкий способ обнаружения потенциальных взаимоблокировок, просматривая циклы на графике получения блокировки.

  • Наши замки также обернуты средствами доступа, которые записываютномер файла / строки приобретения и выпуска.Для двойных разблокировок или двойных блокировок вы получите довольно отладочную информацию о вашем завинчивании.

  • Наши замки также профилированы.Как только ваш код заработает, вы захотите, чтобы он работал хорошо.Мы отслеживаем обычные вещи, такие как, сколько приобретений, сколько времени потребовалось, чтобы приобрести его.

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

  • Наши переменные, которые предназначены длябыть обновленными атомарно, обернуты внутри структуры C.Причина этого заключается в том, чтобы не допустить небрежного кода, в котором вы правильно используете: atomic_increment (& var);и плохо использовать var ++.Мы делаем очень трудным написание последнего кода.

  • "volatile" запрещен в нашей кодовой базе, потому что он неоднозначно реализован компиляторами.Это плохой способ попытаться объединить синхронизацию.

  • И конечно же отзывы кодов.Если вы не можете объяснить коллеге свои предположения о параллелизме и дисциплине блокировки, то определенно есть проблемы с кодом: -)

2 голосов
/ 07 января 2010

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

например: не удерживайте блокировку в коде, который охватывает несколько файлов.

1 голос
/ 07 января 2010

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

...