Название: Семафоры Отправлено: lss от Март 11, 2014, 21:09 Читаю Бланшет/Саммерфилд, синхронизация потоков. Пример по синхронизации двух потоков через семафоры. Один семафор, при создании, инициализируется значением 4096. Понятно: максимальное количество раз захвата ресурса. Другой - инициализируется 0. Не понятно. Через него вообще нельзя захватывать ресурс? Но по коду получается, что можно. Увеличиваем у него счётчик (через release), и захватываем. У первого семаформа, если правильно понимаю, счетчик нельзя увеличить больше 4096. А у второго? Нет ограничения, или как?
Название: Re: Семафоры Отправлено: Old от Март 11, 2014, 23:18 А вы документацию (асистен) по Qt смотрели про класс QSemaphore?
Там для каждого метода показывается с комментариями изменение доступных "ресурсов"... Название: Re: Семафоры Отправлено: lss от Март 11, 2014, 23:42 А вы документацию (асистен) по Qt смотрели про класс QSemaphore? Смотрел. Если вы там видите ответ на мой вопрос, то ткните носом.Там для каждого метода показывается с комментариями изменение доступных "ресурсов"... Название: Re: Семафоры Отправлено: Old от Март 11, 2014, 23:48 Смотрел. Если вы там видите ответ на мой вопрос, то ткните носом. Обратите внимание на комментарии.void QSemaphore::release ( int n = 1 ) Releases n resources guarded by the semaphore. This function can be used to "create" resources as well. For example: QSemaphore sem(5); // a semaphore that guards 5 resources sem.acquire(5); // acquire all 5 resources sem.release(5); // release the 5 resources sem.release(10); // "create" 10 new resources Название: Re: Семафоры Отправлено: Igors от Март 12, 2014, 07:31 "acquire all 5 resources" - каких "ресурсов" ??? Это просто означает что "меня пропустят через семафор если его счетчик >= 5 и при этом счетчик уменьшится". Думайте о семафоре как Вы его видели на ЖД. Горит красный - стоите ждете пока кто-то не включит синий. Тогда проезжаете и свет опять красный. А необходимость в счетчиках != 1 возникает крайне редко
Название: Re: Семафоры Отправлено: lss от Март 12, 2014, 08:03 "acquire all 5 resources" - каких "ресурсов" ??? Это просто означает что "меня пропустят через семафор если его счетчик >= 5 и при этом счетчик уменьшится" И вот этот коментарий дорогого стоит (хоть и в кавычках):Цитировать "create" 10 new resources А необходимость в счетчиках != 1 возникает крайне редко Какой-нибудь пример, для ясности, когда такая необходимость возникает, не могли бы привести?Название: Re: Семафоры Отправлено: Old от Март 12, 2014, 08:09 "acquire all 5 resources" - каких "ресурсов" ??? Мда. Ну давайте на примере ЖД. Вокзал может одновременно принять 5 поездов, семафор устанавливается на число путей. Вот пути это как раз те самые ресурсы.А необходимость в счетчиках != 1 возникает крайне редко Правильно, возникает редко, поэтому можно не разбираться, как работают семафоры. Так знания будут фундаментальней. :)Название: Re: Семафоры Отправлено: Old от Март 12, 2014, 08:13 И вот этот коментарий дорогого стоит (хоть и в кавычках): Это означает в контексте примера с вокзалом, что на вокзале было пять путей, а потом перед олимпмадой достроили еще 10 и теперь вокзал может одновременно принять 15 поездов.Цитировать "create" 10 new resources Название: Re: Семафоры Отправлено: Igors от Март 12, 2014, 08:20 Ну вот классическая задача "производитель-потребитель". Ясно что если производитель ничего не произвел - потребителю нечего потреблять, он и ждет на закрытом семафоре. И тут (предположим) у производителя как-то сразу образовалось аж 10 единиц продукции. Тогда ему разумно сделать release(10), в этом смысле и употребляется "create". Хотя семафору все равно есть ли там какие-то "ресурсы" - он просто открывается/закрывается. Теоретически и потребитель может заграбастать все 10, но обычно это невыгодно т.к. вся нагрузка упадет на одного потребителя.
Название: Re: Семафоры Отправлено: lss от Март 12, 2014, 08:21 Цитировать Мда. Ну давайте на примере ЖД. Вокзал может одновременно принять 5 поездов, семафор устанавливается на число путей. Вот пути это как раз те самые ресурсы. А в коде, где эти пути (ресурсы)? Защищает такой семафор участок кода, зашёл в этот участок один поток, и, якобы, захватил сразу, один, какие-то пять ресурсов. Я понимаю ещё, если бы пять потоков зашли, каждый заход минус одно значение счётчика. Это всё равно, что в вашем примере, прошёл бы через семафор один поезд и сразу занял бы все пять путей.Название: Re: Семафоры Отправлено: Igors от Март 12, 2014, 08:32 Я понимаю ещё, если бы пять потоков зашли, каждый заход минус одно значение счётчика. Это всё равно, что в вашем примере, прошёл бы через семафор один поезд и сразу занял бы все пять путей. Так и есть, хотя я такого поезда никогда не видел :) Проще так: счетчик семафора 5, значит он открыт. Когда через него пройдут 5 нормальных поездов - семафор закроется, следующие поезда будут ждать. Возможен какой-то "особый" поезд который сразу обнулит счетчик acquire(5), тогда семафор закроется сразу Название: Re: Семафоры Отправлено: Old от Март 12, 2014, 08:33 А в коде, где эти пути (ресурсы)? Защищает такой семафор участок кода, зашёл в этот участок один поток, и, якобы, захватил сразу, один, какие-то пять ресурсов. Я понимаю ещё, если бы пять потоков зашли, каждый заход минус одно значение счётчика. Это всё равно, что в вашем примере, прошёл бы через семафор один поезд и сразу занял бы все пять путей. Нуууу для примера, у нас есть 10 каналов связи, нитки могут захватывать их для обмена по очереди, причем нитке может понадобится один канал - просто принять/отправить, а может два - из одного канала передавать в другой.Или несколько или все пути на вокзале закрыли на ремонт. |