Russian Qt Forum

Qt => Вопросы новичков => Тема начата: lss от Март 11, 2014, 21:09



Название: Семафоры
Отправлено: 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
И вот этот коментарий дорогого стоит (хоть и в кавычках):
Цитировать
"create" 10 new resources
Это означает в контексте примера с вокзалом, что на вокзале было пять путей, а потом перед олимпмадой достроили еще 10 и теперь вокзал может одновременно принять 15 поездов.


Название: 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 каналов связи, нитки могут захватывать их для обмена по очереди, причем нитке может понадобится один канал - просто принять/отправить, а может два - из одного канала передавать в другой.

Или несколько или все пути на вокзале закрыли на ремонт.