C ++ 14 semble avoir omis un mécanisme pour vérifier si an std::mutex
est verrouillé ou non. Voir cette question SO:
/programming/21892934/how-to-assert-if-a-stdmutex-is-locked
Il existe plusieurs façons de contourner cela, par exemple en utilisant;
std::mutex::try_lock()
std::unique_lock::owns_lock()
Mais aucune de ces solutions n'est particulièrement satisfaisante.
try_lock()
est autorisé à retourner un faux négatif et a un comportement indéfini si le thread actuel a verrouillé le mutex. Il a également des effets secondaires. owns_lock()
nécessite la construction d'un unique_lock
sur le dessus de l'original std::mutex
.
Évidemment, je pourrais rouler le mien, mais je préfère comprendre les motivations de l'interface actuelle.
La capacité de vérifier le statut d'un mutex (par exemple std::mutex::is_locked()
) ne me semble pas être une demande ésotérique, donc je soupçonne que le Comité de normalisation a délibérément omis cette caractéristique plutôt que d'être une erreur.
Pourquoi?
Edit: Ok donc peut-être que ce cas d'utilisation n'est pas aussi courant que je m'y attendais, donc je vais illustrer mon scénario particulier. J'ai un algorithme d'apprentissage automatique qui est distribué sur plusieurs threads. Chaque thread fonctionne de manière asynchrone et retourne dans un pool maître une fois qu'il a terminé un problème d'optimisation.
Il verrouille ensuite un mutex maître. Le thread doit ensuite choisir un nouveau parent à partir duquel muter une progéniture, mais ne peut choisir que des parents qui n'ont actuellement pas de progéniture qui sont optimisés par d'autres threads. J'ai donc besoin d'effectuer une recherche pour trouver des parents qui ne sont pas actuellement verrouillés par un autre thread. Il n'y a aucun risque que l'état du mutex change pendant la recherche, car le mutex du thread maître est verrouillé. Évidemment, il existe d'autres solutions (j'utilise actuellement un indicateur booléen), mais je pensais que le mutex offre une solution logique à ce problème, car il existe à des fins de synchronisation inter-thread.
is_locked
?