In C ++ 14 scheint ein Mechanismus zur Überprüfung, ob ein std::mutex
gesperrt ist, weggelassen worden zu sein . Siehe diese SO-Frage:
https://stackoverflow.com/questions/21892934/how-to-assert-if-a-stdmutex-is-locked
Es gibt verschiedene Möglichkeiten, um dies zu umgehen, z.
std::mutex::try_lock()
std::unique_lock::owns_lock()
Beides ist jedoch keine besonders befriedigende Lösung.
try_lock()
darf ein falsches Negativ zurückgeben und hat undefiniertes Verhalten, wenn der aktuelle Thread den Mutex gesperrt hat. Es hat auch Nebenwirkungen. owns_lock()
erfordert die Konstruktion eines unique_lock
über dem Original std::mutex
.
Natürlich könnte ich meine eigenen Rollen spielen, aber ich verstehe lieber die Motivationen für die aktuelle Benutzeroberfläche.
Die Möglichkeit, den Status eines Mutex (z. B. std::mutex::is_locked()
) zu überprüfen, scheint mir keine esoterische Aufforderung zu sein, daher vermute ich, dass das Standardkomitee diese Funktion absichtlich ausgelassen hat, anstatt sie zu übersehen.
Warum?
Edit: Ok, vielleicht ist dieser Anwendungsfall nicht so verbreitet, wie ich erwartet hatte, also werde ich mein spezielles Szenario veranschaulichen. Ich habe einen Algorithmus für maschinelles Lernen, der auf mehrere Threads verteilt ist. Jeder Thread arbeitet asynchron und kehrt nach Abschluss eines Optimierungsproblems zu einem Master-Pool zurück.
Dann wird ein Master-Mutex gesperrt. Der Thread muss dann ein neues Elternteil auswählen, von dem ein Nachwuchs mutiert werden soll. Er darf jedoch nur Elternteile auswählen, die derzeit keine Nachwuchskräfte haben, die von anderen Threads optimiert werden. Ich muss daher eine Suche durchführen, um Eltern zu finden, die derzeit nicht von einem anderen Thread gesperrt sind. Es besteht keine Gefahr, dass sich der Status des Mutex während der Suche ändert, da der Master-Thread-Mutex gesperrt ist. Natürlich gibt es andere Lösungen (ich verwende derzeit ein Boolesches Flag), aber ich dachte, der Mutex bietet eine logische Lösung für dieses Problem, da er zum Zwecke der Inter-Thread-Synchronisation existiert.
is_locked
?