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