Espacios de nombres
Variantes

std::shared_lock<Mutex>::lock

De cppreference.com
 
 
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
(C++11)
Gestión genérica de bloqueo
(C++11)
(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)
(C++11)
Recuperación segura
(C++26)
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
 
 
<tbody> </tbody>
void lock();
(desde C++14)

Bloquea el mutex asociado (es decir, toma su propiedad) en modalidad compartida. Efectivamente llama a mutex()->lock_shared().

Parámetros

(Ninguno)

Valor de retorno

(Ninguno)

Excepciones

  • Cualquier excepción lanzada por mutex()->lock_shared().
  • Si no hay un mutex asociado, std::system_error con un código de error de std::errc::operation_not_permitted.
  • Si el mutex ya está bloqueado por este objeto shared_lock (en otras palabras, owns_lock es true), std::system_error con un código de error de std::errc::resource_deadlock_would_occur.

Ejemplo

#include <iostream>
#include <mutex>
#include <string>
#include <shared_mutex>
#include <thread>

std::string archivo = "Contenido original."; // Simula un archivo
std::mutex mtx_salida; // mutex que protege operaciones de salida.
std::shared_mutex mtx_archivo; // mutex lectura/escritura

void leer(int id)
{
    std::string contenido;
    {
        std::shared_lock cerrojo(mtx_archivo, std::defer_lock); // No bloquearlo al inicio.
        cerrojo.lock(); // Bloquearlo aquí.
        contenido = archivo;
    }
    std::lock_guard cerrojo(mtx_salida);
    std::cout << "Contenido leído por el lector #" << id << ": " << contenido << '\n';
}

void escribir()
{
    {
        std::lock_guard cerrojo_de_archivo(mtx_archivo);
        archivo = "Contenido nuevo";
    }
    std::lock_guard cerrojo_de_salida(mtx_salida);
    std::cout << "Contenido nuevo guardado.\n";
}

int main()
{
    std::cout << "Dos lectores leyendo de archivo.\n"
              << "Un escritor que compite con ellos.\n";
    std::thread lector1(leer, 1);
    std::thread lector2(leer, 2);
    std::thread escritor(escribir);
    lector1.join();
    lector2.join();
    escritor.join();
    std::cout << "Las primeras pocas operaciones al archivo listas.\n";
    lector1 = std::thread(leer, 3);
    lector1.join();
}

Posible salida:

Dos lectores leyendo de archivo.
Un escritor que compite con ellos.
Contenido leído por el lector #1: Contenido original.
Contenido leído por el lector #2: Contenido original.
Contenido nuevo guardado.
Las primeras pocas operaciones al archivo listas.
Contenido leído por el lector #3: Contenido nuevo

Véase también

Intenta bloquear el mutex asociado
(función miembro pública) [editar]
Desbloquea el mutex asociado
(función miembro pública) [editar]