Пока я знаком с параллельными концепциями программирования, такими как мьютексы и семафоры, я никогда не понимал, как они реализованы на уровне ассемблера.
Я предполагаю, что есть набор флагов памяти, в которых говорится:
- блокировка A удерживается в потоке 1
- блокировка B удерживается потоком 3
- блокировка C не поддерживается нитью
- и т.д.
Но как синхронизируется доступ к этим флагам между потоками? Что-то вроде этого наивного примера только создало бы состояние гонки:
mov edx, [myThreadId]
wait:
cmp [lock], 0
jne wait
mov [lock], edx
; I wanted an exclusive lock but the above
; three instructions are not an atomic operation :(