Почему std :: atomic_compare_exchange обновляет ожидаемое значение?

Почему std::atomic_compare_exchange а все его братья и сестры обновляют пройденное ожидаемое значение?

Мне интересно, есть ли какие-либо причины, помимо данной простоты в циклах, например: есть ли встроенная функция, которая может сделать это за одну операцию для повышения производительности?

1

Решение

Процессор должен загрузить текущее значение, чтобы выполнить часть операции «сравнить». Когда сравнение не удается, вызывающий должен знать новое значение, чтобы повторить сравнение сравнения (вы почти всегда используете его в цикле), так что если оно не было возвращено (например, путем изменения ожидаемого значения, которое передается по ссылке) тогда для получения нового значения вызывающей стороне потребуется выполнить еще одну атомарную загрузку. Это расточительно, потому что процессор уже загрузил значение. Вы должны возиться только с низкоуровневыми атомарными операциями, когда экстремальная производительность является единственным вариантом, поэтому в этом случае вы не хотите выполнять две операции, когда одна будет выполняться.

6

Другие решения

есть встроенная функция, которая может сделать это за одну операцию для повышения производительности

Что может делать то, что конкретно? Инструкция должна загружать текущее значение, чтобы выполнить сравнение, поэтому при несоответствии, дающем текущее значение, ничего не стоит и в значительной степени гарантированно будет полезно.

2