Ir para o conteúdo

Ú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

Comentários