Семафор (программирование): различия между версиями

[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
м →‎В архитектуре ARM: исправление
Строка 1004:
Увеличение значения семафора может представлять собой циклическое чтение текущего значения счётчика через инструкцию <code>LDREX</code> с последующим увеличением копии значения и попыткой записи обратно в ячейку счётчика с помощью инструкции <code>STREX</code>. При этом чтение может не являться цикличным в случае бинарного семафора, поскольку его увеличение всегда будет приводить к записи в счётчик одного и того же значения, а сама запись не обязана быть синхронизируемой. После успешной записи счётчика, если его изначальное значение было нулевым, требуется возобновить исполнение заблокированных задач, что в случае переключения контекста может решаться средствами операционных систем. Если процессор был заблокирован с помощью инструкции <code>WFE</code>, разблокировать его можно через инструкцию <code>SEV</code>, оповещающей о наличии какого-либо события. Также эта команда может использоваться для разблокировки процессора, если не используется переключение контекста<ref name="arm_sync_primitives">{{arf|ARM Synchronization Primitives|ARM Synchronization Primitives|a=ARM.}}</ref>.
 
После уменьшения или увеличения значения семафора выполняется инструкция <code>DMB</code>, обеспечивающую гарантию целостности памяти защищаемого семафором ресурса<ref name{{sfn|ARM|loc="arm_sync_primitives"1.2.3 />Memory barriers|p=8}}.
 
== См. также ==