рассмотрим такую ситуацию
Имеем три потока с приоритетами Low, Medium, High
в начальном состоянии поток Low захватил mutex в точке 1 потому что он первый,
далее начинает работать стартует поток Medium система передает ему управление так как он имеет более высокий приоритет
потом начинает работать поток High и пытается захватить mutex, так как mutex уже захвачен доходит до точки 3 и ждет
так как поток High ждет, управление передается потоку Medium и пока он не отработает не произойдет инверсии приоритета для
потока Low и поток High не получит управления.
Вот такая дыра обнаружилась
I>рассмотрим такую ситуацию I>Имеем три потока с приоритетами Low, Medium, High I>в начальном состоянии поток Low захватил mutex в точке 1 потому что он первый, I>далее начинает работать стартует поток Medium система передает ему управление так как он имеет более высокий приоритет I>потом начинает работать поток High и пытается захватить mutex, так как mutex уже захвачен доходит до точки 3 и ждет I>так как поток High ждет, управление передается потоку Medium и пока он не отработает не произойдет инверсии приоритета для I>потока Low и поток High не получит управления. I>Вот такая дыра обнаружилась
Что-то у вас какое-то мутное представление о приоритете потоков.
Здравствуйте, fdn721, Вы писали:
I>>[/ccode]
I>>рассмотрим такую ситуацию I>>Имеем три потока с приоритетами Low, Medium, High I>>в начальном состоянии поток Low захватил mutex в точке 1 потому что он первый, I>>далее начинает работать стартует поток Medium система передает ему управление так как он имеет более высокий приоритет I>>потом начинает работать поток High и пытается захватить mutex, так как mutex уже захвачен доходит до точки 3 и ждет I>>так как поток High ждет, управление передается потоку Medium и пока он не отработает не произойдет инверсии приоритета для I>>потока Low и поток High не получит управления. I>>Вот такая дыра обнаружилась
F>Что-то у вас какое-то мутное представление о приоритете потоков.
Вполне нормальное, кстати такое поведение успешно наблюдается на kernel диаграмме под wince
когда управление передается не высоко приоритетному потоку который ждет а какому то другому потоку
впрочем что вам кажется не так в моих рассуждениях?
Здравствуйте, fdn721, Вы писали:
I>>рассмотрим такую ситуацию I>>Имеем три потока с приоритетами Low, Medium, High I>>в начальном состоянии поток Low захватил mutex в точке 1 потому что он первый, I>>далее начинает работать стартует поток Medium система передает ему управление так как он имеет более высокий приоритет I>>потом начинает работать поток High и пытается захватить mutex, так как mutex уже захвачен доходит до точки 3 и ждет I>>так как поток High ждет, управление передается потоку Medium и пока он не отработает не произойдет инверсии приоритета для I>>потока Low и поток High не получит управления. I>>Вот такая дыра обнаружилась
F>Что-то у вас какое-то мутное представление о приоритете потоков.
Ну, при конкретно этой тройке особого вреда не будет, кроме тормозов. А вот появление еще одного потока с high-приоритетом да, с неплохой вероятностью накроет этот пикничок медным тазом. И надолго (ежели не навсегда).
Встретившись пару раз с такой засадой (WinXP, если чего), вскоре перестал маяться дурью задавать приоритеты руками. Профит!
I>рассмотрим такую ситуацию I>Имеем три потока с приоритетами Low, Medium, High I>в начальном состоянии поток Low захватил mutex в точке 1 потому что он первый, I>далее начинает работать стартует поток Medium система передает ему управление так как он имеет более высокий приоритет I>потом начинает работать поток High и пытается захватить mutex, так как mutex уже захвачен доходит до точки 3 и ждет I>так как поток High ждет, управление передается потоку Medium и пока он не отработает не произойдет инверсии приоритета для I>потока Low и поток High не получит управления.
Описанная ситуация как раз и называется инверсией приоритетов, потому что поток с низшим приоритетом (Medium) блокирует поток с высшим приоритетом (High). Разные ОС выходят из неё по-разному. Канонический метод -- поднять приоритет Low до уровня High, пока он не отпустит мутекс. Винда примерно это и делает, только с добавкой недетерминизма (пруф).
Здравствуйте, quodum, Вы писали:
Q>Здравствуйте, ioni, Вы писали:
I>>рассмотрим такую ситуацию I>>Имеем три потока с приоритетами Low, Medium, High I>>в начальном состоянии поток Low захватил mutex в точке 1 потому что он первый, I>>далее начинает работать стартует поток Medium система передает ему управление так как он имеет более высокий приоритет I>>потом начинает работать поток High и пытается захватить mutex, так как mutex уже захвачен доходит до точки 3 и ждет I>>так как поток High ждет, управление передается потоку Medium и пока он не отработает не произойдет инверсии приоритета для I>>потока Low и поток High не получит управления.
Q>Описанная ситуация как раз и называется инверсией приоритетов, потому что поток с низшим приоритетом (Medium) блокирует поток с высшим приоритетом (High). Разные ОС выходят из неё по-разному. Канонический метод -- поднять приоритет Low до уровня High, пока он не отпустит мутекс. Винда примерно это и делает, только с добавкой недетерминизма (пруф).
Именно, если ядро системы видит что высокоприоритетный поток ждет ( Wait функции ) планировщик поднимет приоритет потоку Low ( инверсия )
что бы этот поток быстро освободил блокировку.
В текущей реализации boost::mutex( начиная с версии 1.36 ) этого не произойдет по причине того что система не состоянии определить какой поток держит ресурс.
В результате поток High висит, что категорически не верно.
Здравствуйте, ioni, Вы писали:
I>В текущей реализации boost::mutex( начиная с версии 1.36 ) этого не произойдет по причине того что система не состоянии определить какой поток держит ресурс. I>В результате поток High висит, что категорически не верно.
А ведь правда! Не обратил внимания, что там event.
Интересно, насколько велик импакт. Надо будет освежить детали виндового планировщика, как только доберусь до литературы. Если мне склероз не изменяет, планировщик рано или поздно заметит, что низкоприоритетный поток простаивает, и выдаст ему priority boost, так что совсем уж катастрофы, как в системах с более жёстким планировщиком, не случится.