Както разбирам, когато имам колекция от нишки, защитени от a std::lock_guard
или std::unique_lock
над std::mutex
и мутексът е отключен от изричното му отключване или от заключването, което излиза извън обхвата, след това темата за чакане се съобщава.
Това уведомление е notify_one
или a notify_all
?
Подозирам, че бившият избягва да побърза и да чака, но би искал да е сигурен.
Отговори:
2 за отговор № 1Това, което изглежда да питате, е дали, когато темата T0
е заключил мутекс M
, и нишки T1..Tn
са блокирани, опитвайки се да заключат M
, какво се случва, когато T0
отключва M
? Очевидно само една нишка може успешно да се заключи M
, така че няма да има причина за това"уведомява" (т.е. график) повече от един сервитьор. Въпросът ви обаче не е специфичен за нито една платформа, така че отговорът може да е зависим от внедряването й. "
2 за отговор № 2
Това зависи от изпълнението. Чакащите нишки биха могли активно да чакат в потребителското пространство вътре в контекста на mutex :: lock () за кратко време, за да се отключи mutex и след като бъде отключен, няколко активно чакащи нишки могат да го открият едновременно, но само един ще може да го заключи.В противен случай, след като активният период е преминал mutex.lock () издава системен разговор и OS поставя нишката в списъка на чакащите за този mutex.Когато е отключена само една нишка се събужда / уведомява получи заключване.