1. спорить об этом могут только те, кому важен не результат, а процесс. профессионалы делят по-другому - каждая задача должна решаться на наиболее высоком приемлемом уровне. в частности, многопоточность гораздо лучше делать на том же хаскеле, проблема только в том, что его рантайм добавляет 200-400 кил к exe-файлу. там, где эти лишние килобайты нельзя позволить, придётся использовать более низкоуровневый C++. аналогично, в задаче, обрабатывающей десятки миллионов сообщений в секунду, нужно использовать lock-free структуры синхронизации, если же речь идёт о десятках тысяч сообщений, то вполне сойдёт обычная очередь
используя без необходимости низкоуровневые структуры данных, ты выигрываешь тысячные доли процента быстродействия, тратя в несколько раз больше времени на отладку
2. я же сказал - крит. секциям не нужно заходить в ядро, в частности в менеджер процессов. зачем? всё что там требуется - приостановить обработку других потоков, пытающихся одновременно ворваться в ту же крит. секцию. для этого делается цикл типа
while (critVar!=0);
critVar=1;
// мы внутри крит. секции...
critVar=0;