Короче, младший бит по адресу EAX - это флаг занятости КС. При попытке входа в КС этот бит проверяется и одновременно устанавливается. Если КС занята, то там как была 1, так и осталось, но мы получили инфу о её занятости CF=1. Если свободна, то мы установили 1, получив инфу о том, что она свободна (CF=0).
Освободить секцию можно простым MOV, т.к. он и так атомарен (если не пересекает границу памяти... не помню, то ли размер машинного слова, то ли линии кэша).
Кроме BTS используется также XADD и XCHG (без префикса, т.к. префикс LOCK в этой инструкции срабатывает по умолчанию). Для разных целей используют CMPXCHG (в т.ч. 8B, 16B) и логические/арифметические инструкции (чтобы атомарно выполнить какую-то операцию над переменной из нескольких потоков, не входя в критическую секцию - обычно этот вход нужен, когда нужно сделать блок каких-то операций). В плюсах для этого используется шаблон atomic.