Ú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¶
- Guía de lectura de C++ Concurrency in Action | C++那些事
- Localización de interbloqueos en C++ | C++那些事
- Vectorización SIMD en C++ | C++那些事
- STL paralelo de C++17 | C++那些事
- Depuración multihilo All-Stop con GDB | C++那些事
- Detección de errores de concurrencia con Helgrind | C++那些事
- Principios del bucle de eventos de libev | C++那些事
- Implementación interna de std::thread en C++ | C++那些事
- std::thread y jthread en C++ | C++那些事
- Introducción al multihilo en C++ | C++那些事