c++ boost thread-safety mutex

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.