No dudes en compartir nuestros tutoriales y códigos con tus amigos, necesitamos de tu ayuda para aumentar esta comunidad.
Definido en el encabezado
|
||
---|---|---|
classmutex; |
(desde C ++ 11) |
El mutex
La clase es una primitiva de sincronización que se puede utilizar para proteger los datos compartidos y evitar que varios subprocesos accedan simultáneamente.
mutex
ofrece semántica de propiedad exclusiva y no recursiva:
- Un hilo de llamada posee a
mutex
desde el momento en que llama con éxito alock
otry_lock
hasta que llamaunlock
. - Cuando un hilo posee un
mutex
, todos los demás subprocesos se bloquearán (para llamadas alock
) o recibir unfalse
valor de retorno (paratry_lock
) si intentan reclamar la propiedad delmutex
. - Un hilo de llamada no debe poseer el
mutex
antes de llamarlock
otry_lock
.
El comportamiento de un programa no está definido si un mutex
se destruye mientras aún es propiedad de algún hilo, o un hilo termina mientras posee un mutex
. El mutex
class satisface todos los requisitos de Mutex y StandardLayoutType.
std::mutex
no es copiable ni movible.
Tipos de miembros
Tipo de miembro | Definición |
---|---|
native_handle_type (Opcional) |
definido por la implementación |
Funciones de los miembros
(constructor) | construye el mutex (función de miembro público) |
(incinerador de basuras) | destruye el mutex (función de miembro público) |
operador =[deleted] | no copiable (función de miembro público) |
Cierre |
|
cerrar con llave | bloquea el mutex, bloquea si el mutex no está disponible (función de miembro público) |
try_lock | intenta bloquear el mutex, regresa si el mutex no está disponible (función de miembro público) |
desbloquear | desbloquea el mutex (función de miembro público) |
Mango nativo |
|
native_handle | devuelve el objeto de identificador nativo definido por la implementación subyacente (función de miembro público) |
Notas
std::mutex
generalmente no se accede directamente: std::unique_lock
, std::lock_guard
, o std::scoped_lock
(desde C ++ 17) administrar el bloqueo de una manera más segura para las excepciones.
Ejemplo
Este ejemplo muestra cómo un mutex
se puede utilizar para proteger un std::map
compartido entre dos hilos.
#include#include#include #include #include #include std::map<std::string, std::string> g_pages; std::mutex g_pages_mutex;voidsave_page(const std::string &url)// simulate a long page fetch std::this_thread::sleep_for(std::chrono::seconds(2)); std::string result ="fake content"; std::lock_guard<std::mutex>guard(g_pages_mutex); g_pages[url]= result;intmain() std::thread t1(save_page,"http://foo"); std::thread t2(save_page,"http://bar"); t1.join(); t2.join();// safe to access g_pages without lock now, as the threads are joinedfor(constauto&pair : g_pages) std::cout << pair.first <<" => "<< pair.second <<'n';
Producción:
http://bar => fake content http://foo => fake content