Considere lo siguiente C++ función miembro:Sincronización de acceso a un valor de retorno
size_t size() const
{
boost::lock_guard<boost::mutex> lock(m_mutex);
return m_size;
}
La intención aquí no es para sincronizar el acceso a la variable miembro privada m_size
, pero sólo para asegurarse de que la persona que llama recibe un valor válido para m_size. El objetivo es evitar que la función regrese m_size
al mismo tiempo que otro hilo está modificando m_size
.
Pero, ¿hay alguna condición de carrera potencial para llamar a esta función? No estoy seguro de si el bloqueo de estilo RAII aquí es adecuado para proteger contra una condición de carrera. Supongamos que el destructor de la cerradura se llama antes de, ¿el valor de retorno de la función se inserta en la pila?
¿Tendría que hacer algo como lo siguiente para garantizar la seguridad del hilo?
size_t size() const
{
size_t ret;
{
boost::lock_guard<boost::mutex> lock(m_mutex);
ret = m_size;
}
return ret;
}
No creo que tu cerradura realmente haga nada. Siempre que 'm_size' se pueda leer en su totalidad en una sola operación atómica, obtendrá un valor válido. –
Esto no está garantizado en realidad. Sin embargo, el uso de 'std :: atomic' con C++ 0x garantizaría esto sin bloqueo. –
@Mike: las cerraduras también son una barrera de memoria. Tal es necesario para sincronizar cachés de procesador, etc. – sbi