Hardfalse-sharing

Что такое false sharing и как избежать?

1Постановка

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

2Решение

False sharing — разные потоки пишут в разные переменные, лежащие в одной cache line (64 байта). Cache coherence инвалидирует line у всех ядер при записи — производительность падает в 5–10 раз.

// ПЛОХО: потоки топят друг друга в одной cache line
struct CounterBad { std::atomic<int> val; };
CounterBad counters[8];           // sizeof < 64 → в одной line

// ХОРОШО: padding выравнивает каждую под cache line
struct alignas(64) Counter {
    std::atomic<int> val;
};
Counter counters[8];              // каждый в своей line

В C++17 есть std::hardware_destructive_interference_size — рекомендованный размер padding. Обратное — true sharing (чтение одних данных) — хорошо. Детектят через perf c2c, VTune.

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

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

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