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()
) не здається мені езотеричним запитом, тому я підозрюю, що Комітет зі стандартів навмисно опустив цю функцію, а не як нагляд.
Чому?
Редагувати: Гаразд, можливо, цей випадок використання не такий поширений, як я очікував, тому я проілюструю свій конкретний сценарій. У мене є алгоритм машинного навчання, який розподіляється на декілька потоків. Кожен потік функціонує асинхронно і повертається в основний пул, як тільки він закінчив проблему оптимізації.
Потім він блокує основний мютекс. Потім потік повинен вибрати нового батьків, з якого мутуватиме потомство, але може вибирати лише батьків, у яких наразі немає потомства, оптимізованих іншими потоками. Тому мені потрібно здійснити пошук, щоб знайти батьків, які наразі не заблоковані іншою темою. Не існує ризику зміни статусу мютексу під час пошуку, оскільки мутекс головного потоку заблокований. Очевидно, є й інші рішення (я зараз використовую булевий прапор), але я подумав, що mutex пропонує логічне рішення цієї проблеми, оскільки вона існує для межпотокової синхронізації.
is_locked
?