Ну, допустим, есть объекты, получающие от диспетчера через HandleMsg кванты времени. И передающие их ниже своим агрегированным объектам.

Для задач, где сложный "поток логики" и не хотелось бы прерываться, можно использовать нечто типа fiber-ов: в определённых местах процедуры ставится вызов типа Dispatcher.Switch, при котором диспетчер даёт поработать другой процедуре (всё в одном потоке).
Взаимное исключение на уровне защиты целостности уже становится не нужным.
Кстати, в Composita швейцарцы сделали именно такой параллелизм, но вызовы Switch вшивает в код компилятор (насколько я вкуривал их документацию).
А теперь поделим лёгкие задачи (так, чтобы они практически не пересекались по общим данным) между потоками по числу ядер. Тут уже взаимное исключение, конечно, понадобится, на взаимодействиях между несколькими "областями". Но появляется возможность синхронизации, которой нет при обычных потоках. Например, сборщику надо остановить всю активность в системе. При обычных потоках вы не можете их остановить просто так - хрен знает, где он был застукан.... Для отладочных целей проверяют регистр IP потока - и если он в неприличном месте, то поток снова резюмят, а потом опять суспендят, пока он не будет где-нибудь в подходящем месте... Но это только для отладки.
Так вот, при легковесном параллелизме, когда у вас все активности переключаются через Switch, то вы можете легко сделать GlobalLock в моменты, когда они вызовут Switch.
Ну а от зависаний защита - поток-watchdog, который генерирует исключение в том потоке, который слишком долго не вызывал Switch...