В C ++ 14, похоже, пропущен механизм проверки, std::mutex
заблокирован ли объект или нет. Посмотрите этот ТАК вопрос:
/programming/21892934/how-to-assert-if-a-stdmutex-is-locked
Есть несколько способов обойти это, например, используя;
std::mutex::try_lock()
std::unique_lock::owns_lock()
Но ни один из них не является особенно удовлетворительным решением.
try_lock()
разрешено возвращать ложный минус и имеет неопределенное поведение, если текущий поток заблокировал мьютекс. У этого также есть побочные эффекты. owns_lock()
требует построения unique_lock
поверх оригинала std::mutex
.
Очевидно, я мог бы бросить свой собственный, но я бы лучше понял мотивы для текущего интерфейса.
Возможность проверить состояние мьютекса (например std::mutex::is_locked()
) не кажется мне эзотерическим запросом, поэтому я подозреваю, что Комитет по стандартизации намеренно пропустил эту функцию, а не упустил ее.
Зачем?
Изменить: Хорошо, возможно, этот вариант использования не так часто, как я ожидал, поэтому я проиллюстрирую мой конкретный сценарий. У меня есть алгоритм машинного обучения, который распределен по нескольким потокам. Каждый поток работает асинхронно и возвращается в основной пул после завершения задачи оптимизации.
Затем он блокирует мастер мьютекс. Затем поток должен выбрать нового родителя, из которого нужно изменить мутацию потомка, но может выбрать только тех родителей, у которых в настоящее время нет потомков, которые оптимизируются другими потоками. Поэтому мне нужно выполнить поиск, чтобы найти родителей, которые в данный момент не заблокированы другим потоком. Нет риска изменения статуса мьютекса во время поиска, так как мьютекс основного потока заблокирован. Очевидно, что есть и другие решения (в настоящее время я использую логический флаг), но я подумал, что мьютекс предлагает логическое решение этой проблемы, поскольку он существует для синхронизации между потоками.
is_locked
?