He leído muchas preguntas teniendo en cuenta el bloqueo comprobado doble seguro para subprocesos (para singletons o init perezoso). En algunos hilos, la respuesta es que el patrón está completamente roto, otros sugieren una solución.C++ 11: seguro de bloqueo comprobado doble para la inicialización perezosa. ¿Posible?
Así que mi pregunta es: ¿hay alguna manera de escribir un patrón de bloqueo comprobado completamente seguro para subprocesos en C++? Si es así, ¿cómo se ve?
Podemos suponer que C++ 11, si eso hace las cosas más fáciles. Por lo que sé, C++ 11 mejoró el modelo de memoria que podría producir las mejoras necesarias.
Sé que es posible hacerlo en Java haciendo que la variable de doble verificación sea volátil. Como C++ 11 tomó prestadas partes grandes del modelo de memoria de Java, entonces creo que podría ser posible, pero ¿cómo?
Si puede usar C++ 11 simplemente ignore todo el negocio de doble bloqueo comprobado y use variables locales estáticas o 'std :: call_once'. –
¿Los locales estáticos se inicializan de forma perezosa? Y sobre 'call_once': ¿Cómo se asegura de que la llamada una vez no escriba la referencia no creada a la variable? – gexicide
sí, los locals estáticos se inicializan perezosamente de una manera segura para subprocesos. Y 'call_once' garantiza que el sujeto solo se llame una vez; y que ninguna otra llamada a 'call_once' regresa antes de que regrese el que realmente ejecuta la función (puede leer más aquí http://en.cppreference.com/w/cpp/thread/call_once). Cómo funciona eso depende de la implementación. Estas dos cosas existen básicamente, por lo que no debe preocuparse por escribir más
erroresimplementaciones de bloqueo comprobado. –