Мьютекс, при правильной реализации, никогда не может быть заблокирован одновременно.Для этого вам понадобятся некоторые атомарные операции (операции, которые гарантированно будут единственными, что происходят с объектом в один момент), которые имеют полезные свойства.
Одна такая операция - xchg
(exchange) в x86архитектура.Например, xchg eax, [ebp]
прочитает значение по адресу ebp
, запишет значение в eax
по адресу ebp
, а затем установит eax
в считанное значение, гарантируя, что эти действия не будут чередоватьсяс одновременным чтением и записью по этому адресу.
Теперь вы можете реализовать мьютекс.Для блокировки загрузите 1
в eax
, замените eax
значением мьютекса и посмотрите на eax
.Если это 1
, он уже заблокирован, поэтому вы можете захотеть поспать и повторить попытку позже.Если это 0
, вы просто заблокировали мьютекс.Чтобы разблокировать, просто введите значение 0
в мьютекс.
Обратите внимание, что здесь я замаскирую важные детали.Например, x86 xchg
является достаточно атомарным для преимущественной многозадачности на одном процессоре.Когда вы разделяете память между несколькими процессорами (например, в многоядерной системе), этого будет недостаточно, если вы не используете префикс lock
(например, lock xchg eax, [ebp]
, а не xchg eax, [ebp]
), что гарантирует, что только один процессор может получить доступ к этой памяти во время выполнения инструкции .