Hardfalse-sharingperformance

Что такое false sharing?

1Постановка

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

2Решение

False sharing — разные потоки пишут в разные переменные, лежащие в одной cache line (обычно 64 байта). Каждый поток инвалидирует cache line у другого → падение производительности в разы.

// ПЛОХО: счётчики вплотную — false sharing
struct Counter { std::atomic<int> value{0}; };
Counter counters[N];   // sizeof(Counter) ~ 4, всё в одной cache line

// ХОРОШО: выравнивание каждой записи на cache line
struct alignas(64) Counter {
    std::atomic<int> value{0};
    // 60 байт padding неявно (alignas(64))
};
Counter counters[N];   // каждый — своя cache line

C++17: std::hardware_destructive_interference_size — рекомендованный размер для избежания false sharing (обычно 64). Обратная ситуация — true sharing (чтение одной переменной) — полезна.

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

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

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