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(const std::string &url) { // simular la recuperación de una página extensa std::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 unidos for (const auto &pair : g_pages) { std::cout << pair.first << " => " << pair.second << '\n'; } }
Salida:
http://bar => contenido falso http://foo => contenido falso