C ++ 14 sembra aver omesso un meccanismo per verificare se un std::mutex
è bloccato o meno. Vedi questa domanda SO:
Ci sono molti modi per aggirare questo problema, ad es. usando;
std::mutex::try_lock()
std::unique_lock::owns_lock()
Ma nessuna di queste soluzioni è particolarmente soddisfacente.
try_lock()
è autorizzato a restituire un falso negativo e ha un comportamento indefinito se il thread corrente ha bloccato il mutex. Ha anche effetti collaterali. owns_lock()
richiede la costruzione di un unique_lock
sopra il% originalestd::mutex
.
Ovviamente potrei girare il mio, ma preferirei capire le motivazioni per l'interfaccia attuale.
La possibilità di controllare lo stato di un mutex (ad esempio std::mutex::is_locked()
) non mi sembra una richiesta esoterica, quindi sospetto che il Comitato Standard abbia deliberatamente omesso questa funzione piuttosto che una svista.
Perché?
Modifica: Ok, quindi forse questo caso d'uso non è così comune come mi aspettavo, quindi illustrerò il mio particolare scenario. Ho un algoritmo di apprendimento automatico distribuito su più thread. Ogni thread opera in modo asincrono e ritorna a un pool master una volta completato un problema di ottimizzazione.
Quindi blocca un mutex principale. Il thread deve quindi scegliere un nuovo genitore da cui muovere una prole, ma può scegliere solo da genitori che al momento non hanno figli che sono stati ottimizzati da altri thread. Ho quindi bisogno di eseguire una ricerca per trovare i genitori che non sono attualmente bloccati da un altro thread. Non vi è alcun rischio che lo stato del mutex cambi durante la ricerca, poiché il mutex del thread principale è bloccato. Ovviamente ci sono altre soluzioni (attualmente sto usando un flag booleano), ma ho pensato che il mutex offra una soluzione logica a questo problema, dato che esiste per la sincronizzazione inter-thread.