, что память порядка (s) следует использовать для нагрузки с последующим обменом сравнить?
Невозможно сказать, потому что вы не показываете код, где вызывается update()
. Переупорядочение операций с памятью, связанных с этим вызовом, является реальной вещью на определенных платформах, если вы используете memory_order_relaxed
(или что-то меньшее, чем значение по умолчанию). high_water
может фактически использоваться для синхронизации данных между потоками. Если вы не беспокоитесь о тех возможных переупорядочениях, то std::memory_order_relaxed
в порядке.
Как правило, для этих видов операций я бы не использовал более слабый порядок, чем по умолчанию (std::memory_order_seq_cst
). Поскольку std::compare_exchange_strong
является операцией Read-Modify-Write (RMW), которая по определению является дорогостоящей, поскольку она синхронизирует значение атома между ядрами, изменение порядка памяти не будет большим преимуществом. По крайней мере, на X86, с вашим кодом, компилятор выдает тот же самый объектный код для std::memory_order_seq_cst
и std::memory_order_relaxed
.
Боковое примечание, поскольку вы находитесь в цикле, вы можете использовать compare_exchange_weak()
, что может привести к сбоям ложно, но это связано с циклом.
'while (i
Potatoswatter