std::shared_lock<Mutex>::lock
De cppreference.com
<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 estrue), std::system_error con un código de error de std::errc::resource_deadlock_would_occur.
Ejemplo
| Esta sección está incompleta Razón: mostrar un ejemplo significativo de shared_lock::lock |
Ejecuta este código
#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) | |
| Desbloquea el mutex asociado (función miembro pública) |