std::mutex
Definido en el archivo de encabezado <mutex> | ||
class mutex; | (desde C++11) | |
La clase mutex
es una primitiva de sincronización que puede usarse para proteger datos compartidos de un acceso simultáneo por varios hilos.
mutex
ofrece una semántica de propiedad exclusiva, no recursiva:
- Un hilo llamante posee un
mutex
a partir del momento en el que llama con éxito alock
otry_lock
hasta que llama aunlock
. - Cuando un hilo posee un
mutex
, los demás hilos se bloquearán (para las llamadas alock
) o recibirán un valor de retorno false (paratry_lock
) si intentan reclamar la posesión delmutex
. - Un hilo llamante no debe poseer el
mutex
antes de llamar alock
otry_lock
.
El comportamiento de un programa no está definido si un mutex
se destruye si todavía se posee por algún hilo, o un hilo termina mientras posee un mutex
. La clase mutex
satisface todos los requerimientos de Mutex y StandardLayoutType.
std::mutex
no es ni copiable ni movible.
Contenido |
[editar]Tipos miembro
Tipo Miembro | Definición |
native_handle_type (no siempre está presente) | definido por la implementación |
[editar]Funciones miembro
Construye el mutex (función miembro pública) | |
Destruye el mutex (función miembro pública) | |
operator= [eliminada] | No es asignable mediante copia (función miembro pública) |
Bloqueo | |
Bloquea el mutex; se bloquea si el mutex no está disponible (función miembro pública) | |
Intenta bloquear el mutex; regresa si el mutex no está disponible (función miembro pública) | |
Desbloquea el mutex (función miembro pública) | |
Identificador nativo | |
Devuelve el identificador nativo subyacente definido por la implementación (función miembro pública) |
[editar]Notas
Generalmente no se accede a un std::mutex
directamente: std::unique_lock, std::lock_guard, o std::scoped_lock(desde C++17) gestionan el bloqueo de una manera más segura contra excepciones.
[editar]Ejemplo
Este ejemplo muestra cómo un mutex
puede usarse para proteger un std::map compartido entre dos hilos.
#include <iostream>#include <map>#include <string>#include <chrono>#include <thread>#include <mutex> std::map<std::string, std::string> g_pages; std::mutex g_pages_mutex; void save_page(conststd::string&url){// simular la recuperación de una página extensastd::this_thread::sleep_for(std::chrono::seconds(2));std::string result ="contenido falso"; std::lock_guard<std::mutex> guard(g_pages_mutex); g_pages[url]= result;} int main(){std::thread t1(save_page, "http://foo");std::thread t2(save_page, "http://bar"); t1.join(); t2.join(); // ahora es seguro acceder a g_pages sin bloqueo, ya que los hilos están unidosfor(constauto&pair : g_pages){std::cout<< pair.first<<" => "<< pair.second<<'\n';}}
Salida:
http://bar => contenido falso http://foo => contenido falso