2012-02-29 18 views
12

Entiendo que la variable bloqueada por boost::mutex::scoped_lock se desbloquea automáticamente cuando está fuera del alcance.¿Boost Thread's boost :: unique_lock es un bloqueo de ámbito?

¿Qué tal boost::unique_lock, desbloquea automáticamente la variable cuando está fuera del alcance?

¿Puede alguien también señalar una referencia para esa función también.

double x; 
boost::mutex x_mutex; 

void foo() 
{ 
    { 
     boost::unique_lock<boost::mutex> lock(x_mutex); 
     x = rand(); 
    }  
    ...... some calculation which takes 10 second ...... 
    ...... is x still locked here??? ......  
} 

Thanks.

+1

Sí, lo es. La documentación está aquí: http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html#thread.synchronization.locks.unique_lock –

+1

Si el destructor no lo desbloqueó, ¿cuándo lo haría? alguna vez se desbloquea? –

+0

Es de otra manera redondo. 'boost :: mutex :: scoped_lock' es un typedef de' unique_lock'. http://www.boost.org/doc/libs/1_57_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_types.mutex – balki

Respuesta

12

scoped_lock es un unique_lock. En mutex.hpp:

typedef unique_lock<mutex> scoped_lock; 

El destructor llama unlock() si el bloqueo fue adquirida. Por lo tanto, se lanzará cuando salga del alcance.

Ver http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html

no sólo proporciona para el bloqueo de estilo RAII, sino que también permite el aplazamiento de la adquisición de la cerradura hasta que la función de miembro de bloqueo() se llama explícitamente, o tratando de adquirir el bloqueo en una moda sin bloqueo, o con un tiempo de espera excedido. En consecuencia, el desbloqueo() solo se llama en el destructor si el objeto de bloqueo ha bloqueado el objeto bloqueable, o si no ha adoptado un bloqueo en el objeto bloqueable.

+0

Gracias por su respuesta. Si un boost :: unique_lock se desbloquea automáticamente cuando sale del alcance, ¿cuál es la diferencia entre boost :: unique_lock y boost :: mutex :: scoped_lock? Gracias. – 2607

+0

También gracias por señalar la referencia, pero estoy un poco confundido aquí, ¿significa que el destructor se llama automáticamente cuando está fuera del alcance? – 2607

+5

'scoped_lock' es un typedef para' unique_lock '. los vars automáticos declarados en un bloque {} se destruyen cuando se llega al final del bloque, lo que hace posible el [patrón RAII] (http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization). – jspcal