Hardperformanceconcurrency

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

1Постановка

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

2Решение

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

// ПЛОХО: counters рядом в памяти, в одной cacheline
struct Counters { int a; int b; };

// ХОРОШО: разнесли через alignas
struct Counters {
    alignas(64) int a;
    alignas(64) int b;
};
  • Обнаружение: производительность не растёт при добавлении потоков;
  • Решение: alignas(64) для горячих данных разных потоков, padding;
  • В счётчиках — локальные счётчики на поток с финальным редьюсом.

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

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

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