(Изменить: он также включает в себя необычные (пользовательские) стратегии без блокировок, для этого сообщения .
CMPXCHG [memaddr], reg
сравнивает область памяти с EAX
(или AX
, или
AL
); если они одинаковы, он записывает исходный операнд в память
место нахождения. Это, очевидно, можно использовать так же, как XCHG
, но это
может быть использован и другим очень интересным способом, без блокировки
синхронизации.
Предположим, у вас есть процесс, который обновляет общую структуру данных. к
обеспечить атомарность, он генерирует частную обновленную копию данных
состав; когда это закончено, это атомно обновляет единственный указатель
который раньше указывал на старую структуру данных, так что теперь она указывает на
новая структура данных.
Простой способ сделать это будет полезен, если есть некоторые
возможность сбоя процесса, и это дает вам атомарность. Но мы
можно немного изменить эту процедуру, чтобы
одновременные обновления при обеспечении правильности.
Процесс просто атомарно сравнивает указатель со значением, которое он имел
когда он начал свою работу, и если да, то указатель указывает на новый
структура данных. Если какой-то другой процесс обновил структуру данных
в то же время сравнение не удастся, и обмен не будет
бывает. В этом случае процесс должен начаться заново с
обновленная структура данных.