Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, remark, Вы писали:
C>>>Так как легко могут вызвать "узкие места" в загруженный системах — если система переключит поток, который держит спинлок, то другие потоки на этом спинлоке будут бесполезно способствовать глобальному потеплению. А в незагруженных один фиг проще системные мьютексы использовать.
R>>Я так понимаю, что речь идёт о мьютексах с пассивным спинов, а не с активным.
C>С активным спином (т.е. со sched_yield) возможна ситуация, когда какой-нибудь поток может ждать сотни миллисекунд или даже секунды до получения мьютекса. А это тоже очень плохо — я сам как-то натыкался на это.
Мммм... Я запутался... Активным спином я называю, когда поток постоянно "крутится" пытаясь захватить мьютекс (ну максимум выполняя pause). Пассивным — когда поток выполняет sched_yield()/SwitchToThread() между попытками захвата.
Секунду поток может ждать и при условии, что он блокирется на примитиве ядра, типа семафора, поскольку шедулер ОС не fair, он просто работает на слишком низком уровне, что бы быть fair. Да и сами блокирующие мьютексы общего назначения не fair, они просто дают захватить мьютекс первому попавшемуся потоку, не зависимо от того сколько уже ждут другие.