Решение 11 распространенных проблем в многопоточном коде

ОГЛАВЛЕНИЕ

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

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

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

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

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