У меня есть std::condition_variable_any
, который ждет пользовательской блокировки, которая представляет собой композицию из двух мьютексов (одна std::mutex
и одна с общим доступом - std::shared_mutex
). Операция unlock()
просто разблокирует оба взаимного доступа.Условие переменной ожидания при множественных взаимных ошибках
Например (псевдокод):
mutex mutex1;
shared_mutex mutex2;
condition_variable_any cv;
// acquiring the locks
DualLock lock(unique_lock(mutex1), shared_lock(mutex2));
// waiting
cv.wait(lock);
cv.wait()
должен атомарно разблокировки как mutex1
и mutex2
, и положить нить спать, пока cv
не получает уведомление.
Он все еще гарантирует, что нить спала и прислушивалась к уведомлению о переменной состояния, как только какой-либо из mutex1
или mutex2
разблокирован?
Возможно, что один мьютекс разблокирован, а второй поток блокирует его, отправляет уведомление, но этот первый поток еще не спал и не слушал. Таким образом, уведомление никогда не прибывало и никакого пробуждения не происходит.
Если 'DualLock' не использует' станд :: lock' для блокировки мьютексов вы находитесь в опасности тупика. Ваш псевдокод выглядит так, будто вам угрожает тупиковая ситуация в линии, создающей «DualLock». –