Есть 2 потока (a, b) и 1 мьютекс. Мьютексом уже владеет какой то другой поток (не a и не b). Потоки a и b выполняют lock() и становятся в ожидание мьютекса.
В какой очерёдности потоки a и b получат доступ к мьютексу, когда тот освободится? Например, если первым встал на блокировку(выполнил lock()) поток a, а потом b, должен ли первым войти поток a, а после него b или не обязательно?
В общем случае порядок не определен. На стандарт ссылку привести не могу, но в книге Джосаттиса "Стандартная библиотека С++" в разделе 18.5.1 говорится о том, что порядок блокировок не определен.
P.S. Что, как я понимаю, не мешает каким-нибудь стремящимся гарантированно избежать голодания компиляторам + операционным системам применять свои стратегии для того или иного упорядочения вызовов блокировок...
"По-моему, так" (с) Пух
Не обязательно. Случайным образом если приоритет одинаковый.
ОС работает по принципу, что есть "массив" или очередь ожидающих выполнения потоков. В простейших ОС случайным или последовательным образом выбиралось кто сейчас будет работать. В современных ОС ведётся статистика использованого времени потоками, и предпочтение отдаётся самому обделённому временем потоку с учётом приоритета, для того что бы время было примерно равномерно распределено между потоками в рамках одного приоритета.
При одинаковом приоритете вероятность 50%, но приоритет будет отдан "бездельнику", поэтому если первый поток давно не работает, а второй уже набрал статистику времени и остановлен совсем недавно - то управление вполне с большей вероятностью может получить именно первый поток.
Если приоритет разный то могут быть особенности, но как правило предпочтение отдаётся потоку с более высоким приоритетом, но не всегда.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости