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