Hardconcurrencymemory order

Что такое memory order и атомарные операции?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

std::atomic<T> гарантирует неделимость операций. Но кроме неделимости важна видимость изменений между потоками — memory order. По умолчанию memory_order_seq_cst (самая строгая, дорогая); слабее: acquire, release, relaxed.

std::atomic<bool> ready{false};
int data = 0;
// поток A
data = 42;
ready.store(true, std::memory_order_release);
// поток B
while (!ready.load(std::memory_order_acquire)) {}
assert(data == 42);  // гарантируется: всё до release видно после acquire
  • seq_cst — последовательная согласованность (дефолт, самая дорогая);
  • acquire (чтение) / release (запись) — пара создаёт happens-before;
  • relaxed — только атомарность, без гарантий порядка.

Слишком слабый order = баг, слишком сильный = медленно. std::mutex даёт acquire/release бесплатно.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.