Última atualização:2026-10-12
False Sharing e Linhas de Cache em C++¶
Recentemente vi um trecho de código com alinhamento manual e resolvi estudar: qual o impacto de não alinhar?
template <typename T>
class AtomicWithPadding {
private:
static constexpr int kCacheLineSize = 64;
uint8_t padding_before[kCacheLineSize];
public:
std::atomic<T> value;
private:
uint8_t padding_after[kCacheLineSize];
};
Isso traz um ponto obrigatório em entrevistas:
- Cache line
Daí surgem as perguntas de entrevista abaixo — você saberia respondê-las?
- O que é cache line?
- O que é o protocolo MESI?
- O que é false sharing?
- Como garantir a prevenção de false sharing em C++?
- Quais benefícios evitar false sharing traz?
- Você sabe quais duas variáveis o C++17 introduziu para resolver isso?
Então peguei um teste de desempenho cuja implementação aproximada é:
- definir 4 variáveis, a, b, c, d, compartilhadas entre threads
- além disso, alinhar essas quatro variáveis e lançar n threads para o escalonamento.
Segue o benchmark:
------------------------------------------------------------------
Benchmark Time CPU Iterations
------------------------------------------------------------------
singleThread 4.05 ms 4.04 ms 133
directSharing/real_time 8.78 ms 0.069 ms 77
falseSharing/real_time 8.81 ms 0.083 ms 74
noSharing/real_time 1.16 ms 0.071 ms 578
Pode-se ver que noSharing obteve um resultado excelente! A taxa de acerto de cache melhorou muito; é claro que analisar com o perf seria ainda melhor, para observar os L1 cache misses.
As respostas foram publicadas no Planeta do Conhecimento; junte-se a nós para discutir e troque ideias nos comentários. Obrigado~
Tópicos relacionados¶
- Guia de C++ Concurrency in Action | C++那些事
- Depuração de Deadlocks em C++ | C++那些事
- Vetorização SIMD em C++ | C++那些事
- STL Paralela do C++17 | C++那些事
- Depuração All-Stop multi-thread com GDB | C++那些事
- Detecção de Erros de Concorrência com Helgrind | C++那些事
- Princípio do event loop do libev | C++那些事
- Implementação interna de std::thread em C++ | C++那些事
- C++ std::thread e jthread | C++那些事
- Introdução a multi-thread em C++ | C++那些事