c++ - boost scoped_lock vs bloqueo/desbloqueo simple
thread-safety mutex (2)
Voy a usar boost::mutex
de boost/thread/mutex.hpp
. Hay varias formas de bloquear / desbloquear mutex: con scoped_lock
, unique_lock
, lock_guard
, mutex''s member functions ::lock()
y ::unlock()
y las funciones nonmember lock()
y unlock()
.
Me di cuenta de que boost::scoped_mutex
es una de las formas más populares de usar mutex. ¿Por qué es preferible para miembros funciones ::lock()
y ::unlock()
?
Particularmente, ¿por qué debería usar
{
boost::scoped_lock lock(mutex)
// ...
// read/output sharing memory.
// ...
}
más bien que
mutex.lock()
// ...
// read/output sharing memory.
// ...
mutex.unlock()
¿ scoped_lock
es mejor solo por algún punto de vista de codificación de estilo o is ::lock()/::unlock()
no es "thread safe enough"?
¿Por qué es preferible para miembros funciones :: lock () y :: unlock ()?
Por la misma razón, el lenguaje RAII se hizo popular en general (este es solo uno de sus innumerables ejemplos): porque puede estar seguro de que no abandona el alcance actual sin desbloquear el mutex.
Tenga en cuenta que esto no se trata solo de olvidar llamar a unlock()
: una excepción puede ocurrir mientras su mutex está bloqueado, y su llamada para unlock()
nunca puede ser alcanzada, incluso si no tiene ninguna declaración de return
entre su llamada a lock()
y su llamada para unlock()
.
m.lock() // m is a mutex
// ...
foo(); // If this throws, your mutex won''t get unlocked
// ...
m.unlock()
En este caso, se invocará el destructor de su guardia con scoped_lock
durante el desenrollado de la pila, asegurándose de que la scoped_lock
asociada siempre se libere.
{
boost::scoped_lock lock(m); // m is a mutex
// ...
foo(); // If this throws, your RAII wrapper will unlock the mutex
// ...
}
Además, en muchas situaciones esto mejorará la legibilidad de su código, ya que no tendrá que agregar una llamada para unlock()
antes de cada declaración de return
.
puedes usar
std::lock_guard<std::mutex> lock(mutex);
si no quieres usar la biblioteca de impulso.