Consistencia de memoria en C++ - Arquitectura de...

41
Consistencia de memoria en C++ Consistencia de memoria en C++ Arquitectura de Computadores J. Daniel García Sánchez (coordinador) David Expósito Singh Javier García Blas Óscar Pérez Alonso J. Manuel Pérez Lobato Grupo ARCOS Departamento de Informática Universidad Carlos III de Madrid cbed Arquitectura de Computadores Grupo ARCOS http://www.arcos.inf.uc3m.es 1/41

Transcript of Consistencia de memoria en C++ - Arquitectura de...

Page 1: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Consistencia de memoria en C++Arquitectura de Computadores

J. Daniel García Sánchez (coordinador)David Expósito Singh

Javier García BlasÓscar Pérez Alonso

J. Manuel Pérez Lobato

Grupo ARCOSDepartamento de Informática

Universidad Carlos III de Madrid

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 1/41

Page 2: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelo de memoria

1 Modelo de memoria

2 Tipos atómicos

3 Relaciones de ordenación

4 Modelos de consistencia

5 Barreras

6 Conclusión

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 2/41

Page 3: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelo de memoria

C++ y consistencia de memoria

C++11 define un modelo de concurrencia propio comoparte del propio lenguaje.

Objetivo: Evitar la necesidad de escribir código enlenguajes de más bajo nivel (C, ensamblador, ...) paraobtener mayores prestaciones.

Tipos atómicos.Mecanismos de sincronización de bajo nivel.

Permite la construcción de estructuras de datos libresde cerrojos.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 3/41

Page 4: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelo de memoria

Objetos y posiciones de memoria

Objeto: Es una región de almacenamiento.Una secuencia de uno o varios bytes.

Posición de memoria: Es un objeto de un tipo escalar ouna secuencia de campos de bits adyacentes.

Un objeto se almacena en una o varias posiciones dememoria.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 4/41

Page 5: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelo de memoria

Ejemplo

Estructura:struct {

int i ;char c;int d: 10;int e: 16;double f;

};

Posiciones de memoria:1 i.2 c.3 d, e.4 f.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 5/41

Page 6: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelo de memoria

Reglas

Dos hilos pueden acceder a posiciones de memoriadistintas de forma simultánea.

Dos hilos pueden acceder a la misma posición dememoria de forma simultánea si ambos accesos son delectura.

Si dos hilos intentan acceder de forma simultánea a lamisma posición de memoria y alguno de los accesos esde escritura existe una condición de carrera potencial.

Depende de si se obliga un orden entre ambos accesos.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 6/41

Page 7: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelo de memoria

Ordenamiento y condiciones de carrera

Solución clásica: Uso de mecanismos desincronización.

Permite garantizar la exclusión mutua.Basado en SO → Puede ser costoso.

Alternativa: Uso de operaciones atómicas paragarantizar ordenamiento.

Si no se establece el orden entre dos accesos a unaposición de memoria.alguno de los accesos no es atómico,y al menos uno de los accesos es una escritura,estos constituyen una carrera de datos y elcomportamiento del programa no está definido.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 7/41

Page 8: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelo de memoria

Orden de modificación

Orden de modificación: Secuencia de escrituras sobreun objeto.

Si dos hilos ven distintos ordenes de modificación sobre unobjeto hay una carrera de datos.Las modificaciones no tienen por qué ser visibles en elmismo instante en todos los hilos.

Una lectura posterior a una escritura en un mismo hiloobserva el valor escrito o un valor posterior en su ordende modificación.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 8/41

Page 9: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Tipos atómicos

1 Modelo de memoria

2 Tipos atómicos

3 Relaciones de ordenación

4 Modelos de consistencia

5 Barreras

6 Conclusión

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 9/41

Page 10: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Tipos atómicos

Operaciones atómicas

Son operaciones indivisibles.

Si un hilo realiza una lectura atómica de una variable yotro una escritura atómica de la misma variable y no haymás hilos accediendo:

La lectura devuelve el valor previo a la escritura o el valorescrito.

Si alguna de las operaciones (lectura o escritura) es noatómica el comportamiento no está definido.

Se puede obtener un valor que no sea ni el anterior ni elposterior.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 10/41

Page 11: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Tipos atómicos

Tipos atómicos

El tipo genérico atomic<T> permite definir variablesatómicas para el tipo T, donde T es:

Un tipo integral.Un tipo puntero.El tipo bool.No está definido para tipos reales (float, double).También para tipos definidos por el usuario que cumplancon algunas restricciones.

Todos los tipos atómicos tienen un miembrois_lock_free().

Determina si su implementación es libre de cerrojos.

Además existe un tipo atomic_flag:El único que garantiza ser libre de cerrojos.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 11/41

Page 12: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Tipos atómicos

Operaciones sobre tipos atómicos

Las operaciones sobre atómicos pueden especificaropcionalmente un ordenamiento de memoria.

Por defecto memory_order_seq_cst.Operaciones de almacenamiento:

memory_order_relaxed, memory_order_release,memory_order_seq_cst.

Operaciones de lectura:memory_order_relaxed, memory_order_consume,memory_order_acquire, memory_order_seq_cst

Operaciones lectura-modificación-escritura:memory_order_relaxed, memory_order_consume,memory_order_acquire, memory_order_release,memory_order_acq_rel, memory_order_seq_cst.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 12/41

Page 13: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Tipos atómicos

atomic_flag

Tipo atómico más simple posible.Dos estados posibles: activado o desactivado.Siempre es libre de cerrojos.

Siempre hay que iniciarlos explícitamente a desactivado.

std :: atomic_flag f1 = ATOMIC_FLAG_INIT;

Operaciones:Desactivar:

f1 . clear () ;

Activar y comprobar valor previo:

f1 .test_and_set();

Pueden indicar el orden de memoria de la operación.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 13/41

Page 14: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Tipos atómicos

Ejemplo: Un spin lock

Cerrojo que no hace uso de servicios del SO.Útil si los bloqueos van a durar muy poco tiempo y sequiere evitar problemas de cambio de contexto.

spin lock mutex

class spinlock_mutex {private:

std :: atomic_flag f ;public:

spinlock_mutex() : f {ATOMIC_FLAG_INIT} {}

void lock() {while ( f . test_and_set()) {}

}void unlock() {

flag .clear () ;}

};cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 14/41

Page 15: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Tipos atómicos

atomic_bool

Más operaciones que atomic_flag.Se puede iniciar y asignar con bools.No se puede copiar de otro atomic<bool>.Modificación: a.store(orden)Consulta: a.exchange(b, orden)Conversión automática a bool (consistencia sec.):a.load(orden)

Ejemplo

std :: atomic<bool> a;bool x = a.load(std :: memory_order_acquire);a.store(true) ;x = a.exchange(false, std::memory_order_acq_rel);

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 15/41

Page 16: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Tipos atómicos

Comparación e intercambio

Compara el valor del atómico con un valor esperado.Si son iguales almacena el valor deseado en el atómico.Si no son iguales no modifica el atómico.Siempre retorna indicación de éxito fracaso.

Dos versiones:1 a.compare_exchange_weak(e,d):

Permite fallos espúreos (cambio de contexto) en algunasarquitecturas.Puede comportarse como si *this!=e incluso aunque seaniguales

2 a.compare_exchange_strong(e,d):No permite fallos espúreos.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 16/41

Page 17: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Tipos atómicos

atomic_address

Acceso atómico a una dirección de memoria.No se puede copiar.Se puede copiar un puntero (void*).Interfaz similar a atomic<bool>:

is_lock_free(), load(), store(), exchange(),compare_exchange_weak(),compare_exchange_strong().

Operaciones adicionales.fetch_add(), fetch_sub().

Permiten especificar ordenamiento.Devuelven valor previo al cambio.

+=, -=.Devuelven valor posterior al cambio.Todas usan aritmética de byte.

Otras aritméticas con atomic<T*>.cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 17/41

Page 18: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Tipos atómicos

atomic<integral>

Aplicable a todos los tipos integrales.Operaciones generales:

is_lock_free(), load(), store(), exchange(),compare_exchange_weak(),compare_exchange_strong().

Operaciones aritméticas:fetch_add(), fetch_sub(), fetch_and(), fetch_or(),fetch_xor().+=, -=, &=, |=, ˆ=.++x, x++, –x, x–No hay otras operaciones aritméticas (*, /, %).

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 18/41

Page 19: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Relaciones de ordenación

1 Modelo de memoria

2 Tipos atómicos

3 Relaciones de ordenación

4 Modelos de consistencia

5 Barreras

6 Conclusión

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 19/41

Page 20: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Relaciones de ordenación

Relación sincroniza-con

Relación entre operaciones sobre tipos atómicos.

Una escritura sobre un valor atómico sincroniza-con unalectura sobre ese valor atómico que lee el valor:

i Almacenado por esa escritura.ii Almacenado por una escritura subsiguiente del mismo

hilo que realizó la escritura.iii Almacenado por una secuencia de operaciones

read-modify-write sobre el valor de cualquier hilo en laque la primera operación leyó el valor almacenado por laescritura.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 20/41

Page 21: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Relaciones de ordenación

Relación ocurre-antes

Especifica qué operación ve los efectos de otraoperación.

Dentro de un hilo, una operación ocurre-antes que otra siaparece en una sentencia anterior.

No hay orden entre dos operaciones que aparecen enla misma sentencia.

Entre dos hilos, una operación en un hilo ocurre-antesque otra operación de otro hilo si:

i Existe una relación sincroniza-con entre ambas.ii Existe una cadena de relaciones ocurre-antes y

sincroniza-con entre ellas.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 21/41

Page 22: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Relaciones de ordenación

Ordenación: Consistencia secuencial

Ejemplo

std :: vector<int> v;std :: atomic_bool f(false) ;

void escritor () {v.push_back(1); // #1f = true; // #2

}

void lector () {while(! f . load() ) { // #3

std :: this_thread :: sleep(std :: milliseconds(1)) ;

}std :: cout << v[0] << std ::endl; // #4

}

v.push_back(1);

f=true;

f.load() false

f.load() true

std::cout « v[0];

Único resultado posible:v[0] == 1.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 22/41

Page 23: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelos de consistencia

1 Modelo de memoria

2 Tipos atómicos

3 Relaciones de ordenación

4 Modelos de consistencia

5 Barreras

6 Conclusión

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 23/41

Page 24: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelos de consistencia

Consistencia secuencial

memory_order_seq_cst.El programa es consistente con una vista secuencial.Si todas las operaciones sobre atómicos sonsecuencialmente consistentes, el comportamiento delprograma multihilo es como si todas las operaciones serealizasen en algún orden particular en un único hilo.No puede haber reordenaciones.Es el modelo más simple de razonar.Es el modelo más costoso en rendimiento.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 24/41

Page 25: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelos de consistencia

Acceso

td :: atomic<bool> x, y;std :: atomic<int> z;

void f () {x.store(true, std :: memory_order_seq_cst);

}

void g() {y.store(true, std :: memory_order_seq_cst);

}

void h() {while (!x.load(std :: memory_order_seq_cst)) {}if (y.load(std :: memory_order_seq_cst)) ++ z;

}

void i () {while (!y.load(std :: memory_order_seq_cst)) {}if (x.load(std :: memory_order_seq_cst)) ++z;

}

Lanzamiento de hilos

int main() {x = false;y = false;z = 0;

std :: thread t1{ f };std :: thread t2{g};std :: thread t3{h};std :: thread t4{ i };

t1 . join () ;t2 . join () ;t3 . join () ;t4 . join () ;

assert(z.load() !=0) ;

return 0;}

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 25/41

Page 26: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelos de consistencia

Consistencia sequencial: Análisis

x.store(true) x.load() false

x.load() true

y.load() false y.store(true)

y.load()

y.load() true

x.load()false? true

z++

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 26/41

Page 27: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelos de consistencia

Consistencia sequencial: Análisis

x.store(true) x.load() false

x.load() true

y.load() false y.store(true)

y.load()

y.load() true

x.load() false?true

z++

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 27/41

Page 28: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelos de consistencia

Ordenes secuencialmente no consistentes

Deja de haber un orden global de los eventos.Cada hilo puede tener una vista diferente.

Los hilos pueden no estar de acuerdo en el orden de loseventos.

Pero, . . .Todos los hilos deben estar de acuerdo en el orden demodificación de cada variable.

Alternativas:Ordenamiento relajado.Ordenamiento adquisición liberación.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 28/41

Page 29: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelos de consistencia

Ordenamiento relajado

memory_order_relaxedOperaciones relajadas sobre atómicos no participan en larelación sincroniza-con.

Operaciones sobre misma variable en mismo hilo sicumplen relación ocurre-antes.

No se pueden reordenar accesos a una variable atómicadentro de un mismo hilo.

Una vez que un hilo ha visto un valor de una variable nopude ver un valor más antiguo de esa variable.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 29/41

Page 30: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelos de consistencia

Ejemplo

Acceso a datos

std :: atomic<bool> x, y; std :: atomic<int> z;

void f () {x.store(true, std :: memory_order_relaxed);y.store(true, std :: memory_order_relaxed);

}void g() {

while (!y.load(std :: memory_order_relaxed)) {}if (x.load(std :: memory_order_relaxed)) { ++z; }

}

int main() {x=false; y=false; z=0;std :: thread t1{ f }; std :: thread t2{g};t1 . join () ; t2 . join () ;return 0;

}

x.store(true);

y.store(true);

y.load() false

y.load() true

x.load() ??

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 30/41

Page 31: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelos de consistencia

Orden de adquisición/liberación

memory_order_acquire, memory_order_release,memory_order_acq_rel.

Nivel intermedio de sincronización.

Una operación de liberación que escribe un valor sesincroniza-con una operación de adquisición que leedicho valor.

Impacto:Distintos hilos pueden ver distintos órdenes.No todos los órdenes son posibles.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 31/41

Page 32: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelos de consistencia

Acceso

std :: atomic<bool> x, y;std :: atomic<int> z;

void f () {x.store(true, std :: memory_order_release);

}

void g() {y.store(true, std :: memory_order_release);

}

void h() {while (!x.load(std :: memory_order_acquire)) {}if (y.load(std :: memory_order_acquire)) ++ z;

}

void i () {while (!y.load(std :: memory_order_acquire)) {}if (x.load(std :: memory_order_acquire)) ++z;

}

Lanzamiento de hilos

int main() {x = false;y = false;z = 0;

std :: thread t1{ f };std :: thread t2{g};std :: thread t3{h};std :: thread t4{ i };

t1 . join () ;t2 . join () ;t3 . join () ;t4 . join () ;

assert(z.load() !=0) ;return 0;

}

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 32/41

Page 33: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelos de consistencia

Análisis

x.store(true,release) x.load(acquire) false

x.load(acquire) true

y.load(acquire) false y.store(true,release)

y.load(acquire)

y.load(acquire) true

x.load(acquire)? ?

Múltiples ordenes son posibles porque no hay relacionesacquire → release.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 33/41

Page 34: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Modelos de consistencia

Combinación de órdenes

Se puede obtener un efecto equivalente a consistenciasecuencial con menos coste.

Accesostd :: atomic<bool> x, y; std :: atomic<int> z;

void f () {x.store(true, std :: memory_order_relaxed);y.store(true, std :: memory_order_release);

}void g() {

while (!y.load(std :: memory_order_acquire)) {}if (x.load(std :: memory_order_relaxed)) ++z;

}int main() {

x = false; y = false; z = 0;std :: thread t1{ f }; std :: thread t2{g};t1 . join () ; t2 . join () ;assert(z.load() !=0) ;

return 0;}

x.store(true,relaxed);

y.store(true,release);

y.load(acquire) false

y.load(acquire) true

x.load(relaxed) true

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 34/41

Page 35: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Barreras

1 Modelo de memoria

2 Tipos atómicos

3 Relaciones de ordenación

4 Modelos de consistencia

5 Barreras

6 Conclusión

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 35/41

Page 36: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Barreras

Barreras

Fuerzan ordenación sin modificar datos.

Ejemplo

std :: atomic<bool> x, y;std :: atomic<int> z;

void f () {x.store(true, std :: memory_order_relaxed);std :: atomic_thread_fence(std::memory_order_release);y.store(true, std :: memory_order_relaxed);

}

void g() {while (!y.load(std :: memory_order_relaxed)) {}std :: atomic_thread_fence(std::memory_order_acquire);if (x.load(std :: memory_order_relaxed)) ++z;

}

Hilos

int main() {x = false;y = false;z = 0;

std :: thread t1( f ) ;std :: thread t2(g);

t1 . join () ;t2 . join () ;

assert(z.load() !=0) ;return 0;

}

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 36/41

Page 37: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Barreras

Barreras: Análisis

x.store(true,relaxed);

fence(release);

y.store(true,relaxed);

y.load(relaxed) true

fence(acquire)

x.load() true

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 37/41

Page 38: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Conclusión

1 Modelo de memoria

2 Tipos atómicos

3 Relaciones de ordenación

4 Modelos de consistencia

5 Barreras

6 Conclusión

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 38/41

Page 39: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Conclusión

Resumen

El modelo de memoria de C++ define las reglas de accesoa memoria de un programa correcto.

Permite programación portable de estructuras de datoslibres de cerrojos.

Los tipos atómicos permite realizar operaciones dememoria especificando un ordenamiento.

El ordenamiento por defecto es consistencia secuencial.

Las relaciones sincroniza-con y ocurre-antes definenrestricciones sobre los ordenamientos de operaciones.Las barreras permiten forzar ordenamientos sin modificardatos.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 39/41

Page 40: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Conclusión

Referencias

C++ Concurrency in Action. Practical multithreading.Anthony Williams.Capítulo 5.

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 40/41

Page 41: Consistencia de memoria en C++ - Arquitectura de Computadoresocw.uc3m.es/ingenieria-informatica/arquitectura-de... · Consistencia de memoria en C++ Modelos de consistencia Consistencia

Consistencia de memoria en C++

Conclusión

Consistencia de memoria en C++Arquitectura de Computadores

J. Daniel García Sánchez (coordinador)David Expósito Singh

Javier García BlasÓscar Pérez Alonso

J. Manuel Pérez Lobato

Grupo ARCOSDepartamento de Informática

Universidad Carlos III de Madrid

cbed – Arquitectura de Computadores – Grupo ARCOS – http://www.arcos.inf.uc3m.es 41/41