Повысить общий мьютекс, если он заблокирован в том же потоке
Когда я пишу многопоточные алгоритмы, я считаю, что для некоторых методов полезно ожидать состояния мьютекса. Для кого-то это уже заперто, для кого-то это не так.
Я придумываю подход, как утверждать, что мьютекс уже должен быть заблокирован:
ASSERT(!mutex.try_lock_shared()); // assert if the mutex is not uniquely locked
ASSERT(!mutex.try_lock()); // assert if the mutex is not at least shared locked
Вопрос в том, как я могу утверждать, что проверяет, что мьютекс не заблокирован... из текущего потока. Например, если я сделаю это
if (mutex.try_lock()) {
mutex.unlock();
} else {
ASSERT(false); // the mutex is locked
}
очевидно, что время от времени происходит сбой только потому, что какой-то другой поток заблокирован.
1 ответ
boost имеет рекурсивные и нерекурсивные мьютексы. Если функция реентерабельна, используйте рекурсивный мьютекс. Тогда вам не нужно беспокоиться, заблокировал ли его текущий поток.