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 подскажет развёрнутый ответ в реальном времени.