Решение 11 распространенных проблем в многопоточном коде
ОГЛАВЛЕНИЕ
Правильно сконструированный одновременно выполняемый код должен следовать дополнительному набору правил по сравнению со своим последовательным аналогом. Чтение и запись из памяти, а также доступ к общим ресурсам должны регулироваться с использованием синхронизации, чтобы избежать конфликтов. Вдобавок, для потоков часто становится необходимой координация для выполнения определенной работы.
Как прямое следствие этих дополнительных требований, обеспечение постоянного и адекватного продвижения потоков вперед становится нетривиальной задачей. Синхронизация и координация во многом зависят от согласования по времени, которое недетерминистично, с трудом предсказывается и с трудом тестируется.
Сложными эти атрибуты делает просто то, что они требуют изменения способа мышления. Недостаточно изучить единственный интерфейс API или скопировать фрагмент кода. На практике дело приходится иметь с фундаментальным набором концепций, который необходимо выучить и освоить. Бывает, что некоторые концепции определенных языков и библиотек остаются скрытыми долгое время, но те, кто работает с одновременностью сейчас, не могут рассчитывать на такой подарок. В этой статье описаны некоторые из наиболее распространенных проблем, о которых нужно знать, и предоставлены советы, как учитывать их в своем программном обеспечении.
Я начну с рассмотрения тех вещей, которые часто работают неправильно в одновременных программах. Я именую их «угрозами корректности», поскольку с ними так легко столкнуться и поскольку их последствия обычно весьма нежелательны. Эти угрозы могут привести к нарушениям работы программ, вызывая их сбои или повреждая память.