Синхронизироваться надо, вот и всё. Критические секции, семафоры - подойдут
Нет, не всё. Не всегда использование этих элементов оправдано. Они работают, если программист думает о синхронном выполнении задач. А задачи можно решать через цепочки асинхронных сообщений между объектами. И это может уменьшить простаивание потоков в ожидании входа в критические секции. Правда, для этого требуется множество "лёгких" потоков (green threads). Одной из разновидностей такого подхода можно назвать мультиплексирование.
P.S.
Вот они:http://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F Шаблоны параллельного программирования.
Я не согласен, что функциональная декомпозиция по модулям - это вообще шаблон. Это чистый метод, в нём нет скелета, нет частей, играющих какие-то роли, которые должны быть в шаблоне.