Вы правы, при реализации блокировок вам нужен какой-то способ гарантировать, что два процесса не получат блокировку одновременно. Чтобы сделать это, вам нужно использовать атомарную инструкцию - гарантированно выполненную без прерывания. Одной из таких инструкций является test-and-set , операция, которая получит состояние логической переменной, присвоит ей значение true и вернет ранее полученное состояние.
Это позволяет вам писать код, который постоянно проверяет, может ли он получить блокировку. Предположим, что x является общей переменной между потоками:
while(testandset(x));
// ...
// critical section
// this code can only be executed by once thread at a time
// ...
x = 0; // set x to 0, allow another process into critical section
Поскольку другие потоки постоянно проверяют блокировку, пока их не пропустят в критическую секцию, это очень неэффективный способ гарантировать взаимное исключение. Однако, используя эту простую концепцию, вы можете создавать более сложные управляющие структуры, такие как семафоры, которые намного более эффективны (поскольку процессы не зацикливаются, они спят)