Espacios de nombres
Variantes
Acciones

std::mutex

De cppreference.com
< cpp‎ | thread
 
 
Biblioteca de apoyo de concurrencia
Hilos
(C++11)
(C++20)
Espacio de nombres this_thread
(C++11)
(C++11)
(C++11)
Cancelación cooperativa
Exclusión mutua
mutex
(C++11)
Gestión genérica de bloqueo
(C++11)
(C++11)
(C++11)
(C++11)
Variables de condición
(C++11)
Semáforos
Pestillos y barreras
(C++20)
(C++20)
Futuros
(C++11)
(C++11)
(C++11)
Recuperación segura
Punteros de riesgo
Tipos atómicos
(C++11)
(C++20)
Inicialización de tipos atómicos
(C++11)(en desuso en C++20)
(C++11)(en desuso en C++20)
Orden de memoria
Funciones independientes para operaciones atómicas
Funciones independientes para indicadores atómicos
 
 
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 a lock o try_lock hasta que llama a unlock.
  • Cuando un hilo posee un mutex, los demás hilos se bloquearán (para las llamadas a lock) o recibirán un valor de retorno false (para try_lock) si intentan reclamar la posesión del mutex.
  • Un hilo llamante no debe poseer el mutex antes de llamar a lock o try_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]

[editar]Funciones miembro

Construye el mutex
(función miembro pública)[editar]
Destruye el mutex
(función miembro pública)[editar]
operator=
[eliminada]
No es asignable mediante copia
(función miembro pública)[editar]
Bloqueo
Bloquea el mutex; se bloquea si el mutex no está disponible
(función miembro pública)[editar]
Intenta bloquear el mutex; regresa si el mutex no está disponible
(función miembro pública)[editar]
Desbloquea el mutex
(función miembro pública)[editar]
Identificador nativo
Devuelve el identificador nativo subyacente definido por la implementación
(función miembro pública)[editar]

[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
close