Russian Qt Forum
Ноябрь 26, 2024, 17:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Семафоры  (Прочитано 4609 раз)
lss
Гость
« : Март 11, 2014, 21:09 »

Читаю Бланшет/Саммерфилд, синхронизация потоков. Пример по синхронизации двух потоков через семафоры. Один семафор, при создании, инициализируется значением 4096. Понятно: максимальное количество раз захвата ресурса. Другой - инициализируется 0. Не понятно. Через него вообще нельзя захватывать ресурс? Но по коду получается, что можно. Увеличиваем у него счётчик (через release), и захватываем. У первого семаформа, если правильно понимаю, счетчик нельзя увеличить больше 4096. А у второго? Нет ограничения,  или как?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Март 11, 2014, 23:18 »

А вы документацию (асистен) по Qt смотрели про класс QSemaphore?
Там для каждого метода показывается с комментариями изменение доступных "ресурсов"...
Записан
lss
Гость
« Ответ #2 : Март 11, 2014, 23:42 »

А вы документацию (асистен) по Qt смотрели про класс QSemaphore?
Там для каждого метода показывается с комментариями изменение доступных "ресурсов"...
Смотрел. Если вы там видите ответ на мой вопрос, то ткните носом.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Март 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
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Март 12, 2014, 07:31 »

"acquire all 5 resources" - каких "ресурсов" Непонимающий Это просто означает что "меня пропустят через семафор если его счетчик >= 5 и при этом счетчик уменьшится". Думайте о семафоре как Вы его видели на ЖД. Горит красный - стоите ждете пока кто-то не включит синий. Тогда проезжаете и свет опять красный. А необходимость в счетчиках != 1 возникает крайне редко
Записан
lss
Гость
« Ответ #5 : Март 12, 2014, 08:03 »

"acquire all 5 resources" - каких "ресурсов" Непонимающий Это просто означает что "меня пропустят через семафор если его счетчик >= 5 и при этом счетчик уменьшится"
И вот этот коментарий дорогого стоит (хоть и в кавычках):
Цитировать
"create" 10 new resources

А необходимость в счетчиках != 1 возникает крайне редко
Какой-нибудь пример, для ясности, когда такая необходимость возникает, не могли бы привести?
« Последнее редактирование: Март 12, 2014, 08:13 от lss » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Март 12, 2014, 08:09 »

"acquire all 5 resources" - каких "ресурсов" Непонимающий
Мда. Ну давайте на примере ЖД. Вокзал может одновременно принять 5 поездов, семафор устанавливается на число путей. Вот пути это как раз те самые ресурсы.

А необходимость в счетчиках != 1 возникает крайне редко
Правильно, возникает редко, поэтому можно не разбираться, как работают семафоры. Так знания будут фундаментальней. Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Март 12, 2014, 08:13 »

И вот этот коментарий дорогого стоит (хоть и в кавычках):
Цитировать
"create" 10 new resources
Это означает в контексте примера с вокзалом, что на вокзале было пять путей, а потом перед олимпмадой достроили еще 10 и теперь вокзал может одновременно принять 15 поездов.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Март 12, 2014, 08:20 »

Ну вот классическая задача "производитель-потребитель". Ясно что если производитель ничего не произвел - потребителю нечего потреблять, он и ждет на закрытом семафоре. И тут (предположим) у производителя как-то сразу образовалось аж 10 единиц продукции. Тогда ему разумно сделать release(10), в этом смысле и употребляется "create". Хотя семафору все равно есть ли там какие-то "ресурсы" - он просто открывается/закрывается. Теоретически и потребитель может заграбастать все 10, но обычно это невыгодно т.к. вся нагрузка упадет на одного потребителя.  
Записан
lss
Гость
« Ответ #9 : Март 12, 2014, 08:21 »

Цитировать
Мда. Ну давайте на примере ЖД. Вокзал может одновременно принять 5 поездов, семафор устанавливается на число путей. Вот пути это как раз те самые ресурсы.
А в коде, где эти пути (ресурсы)? Защищает такой семафор участок кода, зашёл в этот участок один поток, и, якобы, захватил сразу, один, какие-то пять ресурсов. Я понимаю ещё, если бы пять потоков зашли, каждый заход минус одно значение счётчика. Это всё равно, что в вашем примере, прошёл бы через семафор один поезд и сразу занял бы все пять путей.

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Март 12, 2014, 08:32 »

Я понимаю ещё, если бы пять потоков зашли, каждый заход минус одно значение счётчика. Это всё равно, что в вашем примере, прошёл бы через семафор один поезд и сразу занял бы все пять путей.
Так и есть, хотя я такого поезда никогда не видел Улыбающийся Проще так: счетчик семафора 5, значит он открыт. Когда через него пройдут 5 нормальных поездов - семафор закроется, следующие поезда будут ждать. Возможен какой-то "особый" поезд который сразу обнулит счетчик acquire(5), тогда семафор закроется сразу   
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Март 12, 2014, 08:33 »

А в коде, где эти пути (ресурсы)? Защищает такой семафор участок кода, зашёл в этот участок один поток, и, якобы, захватил сразу, один, какие-то пять ресурсов. Я понимаю ещё, если бы пять потоков зашли, каждый заход минус одно значение счётчика. Это всё равно, что в вашем примере, прошёл бы через семафор один поезд и сразу занял бы все пять путей.
Нуууу для примера, у нас есть 10 каналов связи, нитки могут захватывать их для обмена по очереди, причем нитке может понадобится один канал - просто принять/отправить, а может два - из одного канала передавать в другой.

Или несколько или все пути на вокзале закрыли на ремонт.
« Последнее редактирование: Март 12, 2014, 08:38 от Old » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 23.