Существует целый ряд техник, которые сейчас входят в общественное сознание (как в последние несколько лет). Большой был бы актерами. Это то, что Эрланг впервые применил к сетке, но оно было перенесено на новые языки, такие как Scala (актеры в JVM). Хотя актеры не решают всех проблем, они действительно намного упрощают анализ вашего кода и выявление проблемных мест. Они также значительно упрощают разработку параллельных алгоритмов из-за того, что они заставляют вас использовать продолжение, передаваемое через общее изменяемое состояние.
Fork / Join - это то, на что вам следует обратить внимание, особенно если вы работаете в JVM. Дуг Ли написал основную статью на эту тему, но многие исследователи обсуждали ее на протяжении многих лет. Насколько я понимаю, эталонную среду Дуга Ли планируется включить в Java 7.
На немного менее инвазивном уровне, часто единственные шаги, необходимые для упрощения многопоточного приложения, это просто уменьшить сложность блокировки. Мелкозернистая блокировка (в стиле Java 5) хороша для пропускной способности, но очень и очень трудно понять, как правильно. Одним из альтернативных подходов к блокировке, набирающих популярность благодаря Clojure, является программно-транзакционная память (STM). По сути, это противоположно обычной блокировке в том, что она скорее оптимистичная, чем пессимистичная. Вы начинаете с предположения, что у вас не будет никаких коллизий, а затем позволяете инфраструктуре устранять проблемы, если и когда они возникают. Базы данных часто работают таким образом. Это отлично подходит для пропускной способности в системах с низкой частотой столкновений, но большой выигрыш заключается в логической компонентизации ваших алгоритмов. Вместо того, чтобы произвольно связывать блокировку (или серию блокировок) с некоторыми данными, вы просто заключаете опасный код в транзакцию и позволяете инфраструктуре выяснить остальное. Вы даже можете получить достаточное количество проверок во время компиляции из приличных реализаций STM, таких как монада GHC STM или мой экспериментальный Scala STM.
Существует множество новых возможностей для создания параллельных приложений, выбор которых во многом зависит от вашего опыта, вашего языка и проблемы, которую вы пытаетесь смоделировать. Как правило, я думаю, что действующие лица в сочетании с постоянными неизменяемыми структурами данных - это надежная ставка, но, как я уже сказал, STM немного менее инвазивен и иногда может привести к более быстрым улучшениям.