std::atomic
функции, такие как store
и load
, принимают аргумент std::memory_order
. Аргумент может быть определен во время выполнения, как и любой другой аргумент функции. Однако фактическое значение может повлиять на оптимизацию кода во время компиляции. Рассмотрим следующее:
std::atomic<int> ai1, ai2;
int value = whatever;
void foo() {
std::memory_order memOrd = getMemoryOrder();
register int v = value; // load value from memory
ai1.store(v, memOrd); // dependency on v value
ai2.store(1, memOrd); // no dependency. could this be move up?
}
Если memOrd
оказывается memory_order_relaxed
, второй магазин можно смело перемещать перед первым. Это добавит некоторую дополнительную работу между загрузкой value
и ее использованием, что может помешать ненужным киоскам. Однако, если memOrd
равно memory_order_seq_cst
, переключение хранилищ не должно быть разрешено, потому что какой-то другой поток может рассчитывать на ai1
, уже установленный на value
, если ai2
установлен в 1.
Что мне интересно, почему порядок памяти определяется как параметр времени выполнения, а не время компиляции. Есть ли какая-либо причина для того, чтобы кто-то исследовал среду во время выполнения, прежде чем выбрать лучшую семантику операций с памятью?