O C ++ 14 parece ter omitido um mecanismo para verificar se um std::mutex
está bloqueado ou não. Veja esta pergunta SO:
https://stackoverflow.com/questions/21892934/how-to-assert-if-a-stdmutex-is-locked
Existem várias maneiras de contornar isso, por exemplo, usando;
std::mutex::try_lock()
std::unique_lock::owns_lock()
Mas nenhuma dessas soluções é particularmente satisfatória.
try_lock()
tem permissão para retornar um falso negativo e tem um comportamento indefinido se o encadeamento atual bloqueou o mutex. Também tem efeitos colaterais. owns_lock()
requer a construção de um unique_lock
em cima do original std::mutex
.
Obviamente, eu poderia fazer o meu próprio, mas prefiro entender as motivações para a interface atual.
A capacidade de verificar o status de um mutex (por exemplo std::mutex::is_locked()
) não parece uma solicitação esotérica para mim, então suspeito que o Comitê Padrão tenha omitido deliberadamente esse recurso em vez de ser uma supervisão.
Por quê?
Edit: Ok, então talvez este caso de uso não seja tão comum quanto eu esperava, então ilustrarei meu cenário específico. Eu tenho um algoritmo de aprendizado de máquina que é distribuído em vários threads. Cada encadeamento opera de forma assíncrona e retorna para um pool principal depois de concluir um problema de otimização.
Em seguida, bloqueia um mutex mestre. O encadeamento deve, então, escolher um novo pai para modificar uma prole, mas só pode escolher entre os pais que atualmente não têm filhos que estão sendo otimizados por outros encadeamentos. Portanto, preciso fazer uma pesquisa para encontrar pais que não estão bloqueados no momento por outro segmento. Não há risco de o status do mutex ser alterado durante a pesquisa, pois o mutex do encadeamento principal está bloqueado. Obviamente, existem outras soluções (atualmente estou usando um sinalizador booleano), mas achei que o mutex oferece uma solução lógica para esse problema, pois existe para fins de sincronização entre threads.
is_locked
?