2015-10-01 5 views
-2

CAS - очень примитивная технология свободного доступа, и я знаю, что она атомарна.Я слышал, что инструкция INC не является атомарной. Затем, как инструкция CAS может быть атомарной?

Кроме того, это гораздо более сложная операция, чем INC.

Он должен сравнить значение, и если значение не изменяется, CAS устанавливает новое значение, гарантируя, что другой поток не доступа к нему.

Затем, как CAS является атомарным, а INC - нет.

Я также узнал, что ЗАМОК INC является атомарной операцией, но с высокой стоимостью, чем INC.

Если CAS также использует некоторые подобную технику, как ЗАМОК INC внутри, то почему он называется замок бесплатно технику?

Является ли замок, используемый в CAS, отличается от обычного замка, который мы обычно знаем?

Если да, то сколько разница между стоимостью нормального замка и cas?

+0

Зачем отмечать это как 'C'? – chux

+0

Если вы говорите о x86 (что предлагает 'inc/lock inc'), то' cmpxchg' также не является атомарным. 'lock cmpxchg' является атомарным. – EOF

ответ

0

Сравнение и своп (CAS) реализовано как атомный процессор на большинстве процессорных архитектур. Поскольку он является атомарным на аппаратном уровне, при его использовании не требуется явная блокировка. Компиляторы C обычно знают, имеет ли целевая архитектура инструкцию, поэтому, если вы используете операцию сравнения и свопинга в атомной библиотеке, она, скорее всего, будет использовать эту аппаратную операцию, если она доступна, без каких-либо накладных расходов на явную блокировку.

«Приращение» не определено в многопоточной среде; если другой поток изменил значение, так как текущий поток прочитал его, должен ли результат операции инкремента быть больше, чем значение, которое текущий поток прочитал, или еще одно значение, которое написал другой поток? Для большинства людей интуитивный результат состоит в том, что он должен быть больше, чем значение, которое текущий поток читает, но только если другой поток не написал ему, что фактически делает прирост более сложной операцией, чем сравнение и своп.

1

CaS отличается от заблокированного вкл. LOCK INC семантически блокирует память и выполняет приращение (блокировка не всегда происходит, но эффект такой же, как и было). В результате LOCK INC гарантируется, чтобы увеличить значение, и если два LOCK INC выдаются одновременно с двух разных потоков на одно и то же значение, результатом будет значение, увеличиваемое ровно в два раза. LOCK INC никогда не может потерпеть неудачу.

CaS - это «попытка увидеть». Операция выполняется (а именно, установить значение X, если она равна Y), и она может либо преуспеть - если значение действительно Y или сбой, если это что-то другое. Нет, никто не сможет добиться успеха. Если два потока одновременно выдают одну и ту же операцию CaS на одно и то же значение, только один из них будет успешным, а другой - ошибкой.

Существует также понятие «атомного приращения», которое в основном означает «значение приращения, но не блокирует его». Обычно это делается путем попытки сделать CaS в цикле новым добавочным значением до тех пор, пока оно не завершится успешно. Каждый сбой означает, что новое значение и значение проверки будут скорректированы. В результате атомный приращение потенциально может быть медленным на высокодоходных значениях.

 Смежные вопросы

  • Нет связанных вопросов^_^