Wydaje się, że w C ++ 14 pominięto mechanizm sprawdzania, czy std::mutex
blokada jest zablokowana, czy nie. Zobacz to SO pytanie:
/programming/21892934/how-to-assert-if-a-stdmutex-is-locked
Jest na to kilka sposobów, np. Przy użyciu;
std::mutex::try_lock()
std::unique_lock::owns_lock()
Ale żadne z nich nie jest szczególnie satysfakcjonującym rozwiązaniem.
try_lock()
dozwolone jest zwracanie fałszywego ujemnego i ma niezdefiniowane zachowanie, jeśli bieżący wątek zablokował muteks. Ma również skutki uboczne. owns_lock()
wymaga budowy unique_lock
na górze oryginału std::mutex
.
Oczywiście mógłbym stworzyć własne, ale wolałbym zrozumieć motywy obecnego interfejsu.
Możliwość sprawdzenia statusu muteksu (np. std::mutex::is_locked()
) Nie wydaje mi się ezoteryczną prośbą, więc podejrzewam, że Komitet Standardowy celowo pominął tę funkcję, a nie przeoczenie.
Czemu?
Edycja: Ok, więc może ten przypadek użycia nie jest tak powszechny, jak się spodziewałem, więc zilustruję mój konkretny scenariusz. Mam algorytm uczenia maszynowego, który jest rozłożony na wiele wątków. Każdy wątek działa asynchronicznie i wraca do puli głównej po zakończeniu problemu z optymalizacją.
Następnie blokuje główny muteks. Wątek musi następnie wybrać nowego rodzica, od którego można mutować potomstwo, ale może wybrać tylko od rodziców, którzy obecnie nie mają potomstwa, które jest optymalizowane przez inne wątki. Dlatego muszę przeprowadzić wyszukiwanie, aby znaleźć rodziców, którzy nie są obecnie zablokowani przez inny wątek. Nie ma ryzyka zmiany statusu muteksu podczas wyszukiwania, ponieważ muteks głównego wątku jest zablokowany. Oczywiście istnieją inne rozwiązania (obecnie używam flagi logicznej), ale myślałem, że mutex oferuje logiczne rozwiązanie tego problemu, ponieważ istnieje on w celu synchronizacji między wątkami.
is_locked
?