C ++ 14 parece haber omitido un mecanismo para verificar si un std::mutex
está bloqueado o no. Vea esta pregunta SO:
https://stackoverflow.com/questions/21892934/how-to-assert-if-a-stdmutex-is-locked
Hay varias formas de evitar esto, por ejemplo, usando;
std::mutex::try_lock()
std::unique_lock::owns_lock()
Pero ninguno de estos son soluciones particularmente satisfactorias.
try_lock()
se le permite devolver un falso negativo y tiene un comportamiento indefinido si el hilo actual ha bloqueado el mutex. También tiene efectos secundarios. owns_lock()
requiere la construcción de una unique_lock
encima del original std::mutex
.
Obviamente podría rodar el mío, pero preferiría entender las motivaciones para la interfaz actual.
La capacidad de verificar el estado de un mutex (p std::mutex::is_locked()
. Ej. ) No me parece una solicitud esotérica, por lo que sospecho que el Comité Estándar omitió deliberadamente esta característica en lugar de ser un descuido.
¿Por qué?
Editar: Ok, entonces tal vez este caso de uso no sea tan común como esperaba, así que ilustraré mi escenario particular. Tengo un algoritmo de aprendizaje automático que se distribuye en múltiples hilos. Cada subproceso funciona de forma asíncrona y vuelve a un grupo maestro una vez que ha completado un problema de optimización.
Luego bloquea un mutex maestro. Luego, el subproceso debe elegir un nuevo padre desde el cual mutar una descendencia, pero solo puede elegir entre los padres que actualmente no tienen descendencia que están siendo optimizados por otros subprocesos. Por lo tanto, necesito realizar una búsqueda para encontrar padres que actualmente no están bloqueados por otro hilo. No hay riesgo de que el estado del mutex cambie durante la búsqueda, ya que el mutex del hilo maestro está bloqueado. Obviamente hay otras soluciones (actualmente estoy usando un indicador booleano) pero pensé que el mutex ofrece una solución lógica a este problema, ya que existe con el propósito de sincronización entre subprocesos.
is_locked
?