C ++ 14 sembra aver omesso un meccanismo per verificare se un std::mutex
è bloccato o meno. Vedi questa domanda SO:
/programming/21892934/how-to-assert-if-a-stdmutex-is-locked
Ci sono molti modi per aggirare questo, ad esempio usando;
std::mutex::try_lock()
std::unique_lock::owns_lock()
Ma nessuna di queste sono soluzioni particolarmente soddisfacenti.
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 l'originale std::mutex
.
Ovviamente potrei farlo da solo, ma preferirei capire le motivazioni per l'interfaccia attuale.
La capacità di controllare lo stato di un mutex (ad es. std::mutex::is_locked()
) Non mi sembra una richiesta esoterica, quindi sospetto che il Comitato Standard abbia deliberatamente omesso questa funzionalità piuttosto che essere una svista.
Perché?
Modifica: Ok, quindi forse questo caso d'uso non è così comune come mi aspettavo, quindi illustrerò il mio scenario particolare. Ho un algoritmo di apprendimento automatico che è distribuito su più thread. Ogni thread funziona in modo asincrono e torna a un pool principale dopo aver completato un problema di ottimizzazione.
Quindi blocca un mutex master. Il thread deve quindi scegliere un nuovo genitore da cui mutare una prole, ma può scegliere solo da genitori che attualmente non hanno una prole ottimizzata da altri thread. Devo quindi eseguire una ricerca per trovare 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 thread principale mutex è bloccato. Ovviamente ci sono altre soluzioni (attualmente sto usando un flag booleano) ma ho pensato che il mutex offre una soluzione logica a questo problema, poiché esiste ai fini della sincronizzazione tra thread.
is_locked
?