Очерёдность доступа к мьютексу в C++

100
22 декабря 2021, 01:00

Есть 2 потока (a, b) и 1 мьютекс. Мьютексом уже владеет какой то другой поток (не a и не b). Потоки a и b выполняют lock() и становятся в ожидание мьютекса.

В какой очерёдности потоки a и b получат доступ к мьютексу, когда тот освободится? Например, если первым встал на блокировку(выполнил lock()) поток a, а потом b, должен ли первым войти поток a, а после него b или не обязательно?

Answer 1

В общем случае порядок не определен. На стандарт ссылку привести не могу, но в книге Джосаттиса "Стандартная библиотека С++" в разделе 18.5.1 говорится о том, что порядок блокировок не определен.

P.S. Что, как я понимаю, не мешает каким-нибудь стремящимся гарантированно избежать голодания компиляторам + операционным системам применять свои стратегии для того или иного упорядочения вызовов блокировок...

"По-моему, так" (с) Пух

Answer 2

Не обязательно. Случайным образом если приоритет одинаковый.

ОС работает по принципу, что есть "массив" или очередь ожидающих выполнения потоков. В простейших ОС случайным или последовательным образом выбиралось кто сейчас будет работать. В современных ОС ведётся статистика использованого времени потоками, и предпочтение отдаётся самому обделённому временем потоку с учётом приоритета, для того что бы время было примерно равномерно распределено между потоками в рамках одного приоритета.

При одинаковом приоритете вероятность 50%, но приоритет будет отдан "бездельнику", поэтому если первый поток давно не работает, а второй уже набрал статистику времени и остановлен совсем недавно - то управление вполне с большей вероятностью может получить именно первый поток.

Если приоритет разный то могут быть особенности, но как правило предпочтение отдаётся потоку с более высоким приоритетом, но не всегда.

READ ALSO
Передача параметров в классах с наследованием

Передача параметров в классах с наследованием

Всем привет! Вроде и простое, но не могу понять, как передавать параметрыХочу передать по значению, хотя не важно как

265
Вращение фигуры в openGL относительно заданной точки

Вращение фигуры в openGL относительно заданной точки

Можно ли задать точку вращения для фигуры в openGl? Используя glRotatef() вращается вся плоскость относительно центраДля примера: мне нужно вращать...

219
Как подключить Local Storage к скрипту?

Как подключить Local Storage к скрипту?

Есть переключатель:

237
Динамический массив объектов C#

Динамический массив объектов C#

Есть свой класс (public class MyNum)Как объявить, а потом инициализировать двумерный динамический массив, с объектами моего класса?

135