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
mutexa partir del momento en el que llama con éxito alockotry_lockhasta 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
mutexantes de llamar alockotry_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

Formed in 2009, the Archive Team (not to be confused with the archive.org Archive-It Team) is a rogue archivist collective dedicated to saving copies of rapidly dying or deleted websites for the sake of history and digital heritage. The group is 100% composed of volunteers and interested parties, and has expanded into a large amount of related projects for saving online and digital history.
