Saltar a contenido

Última actualización:2026-10-12

False Sharing y líneas de caché en C++

Hace poco vi un fragmento de código que hacía la alineación manualmente, así que me puse a investigar: ¿qué impacto tiene no alinear?

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];
};

Esto nos lleva a un tema imprescindible en las entrevistas:

  • Cache line

De aquí salen las siguientes preguntas de entrevista, ¿sabrías responderlas?

  • ¿Qué es una cache line?
  • ¿Qué es el protocolo MESI?
  • ¿Qué es el false sharing?
  • ¿Cómo se puede evitar el false sharing en C++?
  • ¿Qué beneficios aporta evitar el false sharing?
  • ¿Sabes qué dos utilidades aportó C++17 para resolver este problema?

Así que busqué una prueba de rendimiento cuya implementación aproximada es:

  • Definir 4 variables, a, b, c y d, compartidas entre varios hilos
  • Además, alinear esas cuatro variables y lanzar n hilos para planificarlas.

A continuación, el 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

¡Se puede ver que noSharing consigue un resultado excelente! La tasa de acierto de la caché mejora enormemente; por supuesto, sería aún mejor analizarlo con perf para observar los fallos de la caché L1.

Las respuestas ya están publicadas en la comunidad 知识星球; te invito a discutirlas juntas en la zona de comentarios, gracias~

Temas relacionados

Comentarios