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 lineC++17: std::hardware_destructive_interference_size — рекомендованный размер для избежания false sharing (обычно 64). Обратная ситуация — true sharing (чтение одной переменной) — полезна.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.