Namespaces
Variants

std:: mutex

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
mutex
(C++11)
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Definido en el encabezado <mutex>
class mutex ;
(desde C++11)

La clase mutex es un primitivo de sincronización que puede utilizarse para proteger datos compartidos de ser accedidos simultáneamente por múltiples hilos.

mutex ofrece semánticas de propiedad exclusiva y no recursiva:

  • Un hilo que realiza la llamada posee un mutex desde el momento en que llama exitosamente a lock o try_lock hasta que llama a unlock .
  • Cuando un hilo posee un mutex , todos los demás hilos se bloquearán (para llamadas a lock ) o recibirán un valor de retorno false (para try_lock ) si intentan reclamar la propiedad del mutex .
  • Un hilo que realiza la llamada no debe poseer el mutex antes de llamar a lock o try_lock .

El comportamiento de un programa es indefinido si un mutex es destruido mientras aún está siendo poseído por algún hilo, o si un hilo termina mientras posee un mutex . La clase mutex satisface todos los requisitos de Mutex y StandardLayoutType .

std::mutex no es copiable ni movible.

Contenidos

Tipos anidados

Nombre Definición
native_handle_type ( opcional* ) definido por la implementación

Funciones miembro

construye el mutex
(función miembro pública)
destruye el mutex
(función miembro pública)
operator=
[deleted]
no asignable por 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, retorna si el mutex no está disponible
(función miembro pública)
desbloquea el mutex
(función miembro pública)
Manejador nativo
retorna el objeto de manejador nativo definido por la implementación subyacente
(función miembro pública)

Notas

std::mutex normalmente no se accede directamente: std::unique_lock , std::lock_guard , o std::scoped_lock (desde C++17) gestionan el bloqueo de manera más segura ante excepciones.

Ejemplo

Este ejemplo muestra cómo un mutex puede utilizarse para proteger un std::map compartido entre dos hilos.

#include <chrono>
#include <iostream>
#include <map>
#include <mutex>
#include <string>
#include <thread>
std::map<std::string, std::string> g_pages;
std::mutex g_pages_mutex;
void save_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;
}
int main() 
{
    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 joined
    for (const auto& [url, page] : g_pages)
        std::cout << url << " => " << page << '\n';
}

Salida:

http://bar => fake content
http://foo => fake content

Véase también

proporciona una facilidad de exclusión mutua que puede ser bloqueada recursivamente por el mismo hilo
(class)
(C++11)
implementa un contenedor de propiedad de mutex estrictamente basado en ámbito
(class template)
implementa un contenedor de propiedad de mutex movable
(class template)
contenedor RAII que evita interbloqueos para múltiples mutexes
(class template)
proporciona una variable de condición asociada con un std::unique_lock
(class)