Кто придумал семафоры, критические секции и исключения ? Придумал их голландский профессор математик Эдсжер Дейкстра (Edsger Wybe Dijkstra) в начале 70 годов (1965-1973).
Рассматривая ситуации с многопользовательским доступом он ввел понятие критический интервал (critical section) . Под критическим интервалом он определил всякую последовательность шагов обработки, в которой последовательный процесс не должен прерываться ни каким другим процессом. Он сопоставил каждому, общему для некоторых процессов, набору данных некоторую запирающую переменную (mutex). Начальное значение которой равно 1. Если к началу критического интервала она больше или равна 1, то интервал должен выполняться, иначе ждать. Вот такой он алгоритм составил (синтаксис С, в оригинале PASCAL).
Mutex=1;
В начале критического интервала.
mutex=mutex-1; if (mutex<0) { // жди; } else { //выполняй; };
В конце критического интервала.
mutex=mutex+1; if (mutex<=0) { //возьми из очереди очередной процесс и выполняй его } else { // все, никого нет };
Во время критического интервала значение mutex равно нулю или отрицательному числу. Абсолютное значение его равно длине очереди. Чтобы лучше понять эти идеи нужно смотреть не со стороны программы, а со стороны операционной системы. Этот алгоритм именно для нее. Только когда два потока обратятся к критической секции в очереди станет 1 (mod(-1)). И когда значение станет 1 тогда ни один поток не находится в критической секции. Для синхронизации со стороны программы было введено понятие семафор, который просто разрешал или запрещал обращаться потоку. Вот эту синхронизацию и назвали синхронизацией запираний или взаимным исключением (mutual exclusion - mutex). Вследствие ошибок при программировании синхронных событий могут возникать системные заторы (system-deadlock) или мертвые хватки (deadly embrace).
Естественно это очень краткое изложение. К сожалению книг Дейкстра у меня нет :-(.
P.S.: Термины и изложения из учебника информатики Мюнхенского технологического университета 1973 год.