Russian Qt Forum
Ноябрь 26, 2024, 17:25
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Семафоры
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Семафоры (Прочитано 4611 раз)
lss
Гость
Семафоры
«
:
Март 11, 2014, 21:09 »
Читаю Бланшет/Саммерфилд, синхронизация потоков. Пример по синхронизации двух потоков через семафоры. Один семафор, при создании, инициализируется значением 4096. Понятно: максимальное количество раз захвата ресурса. Другой - инициализируется 0. Не понятно. Через него вообще нельзя захватывать ресурс? Но по коду получается, что можно. Увеличиваем у него счётчик (через release), и захватываем. У первого семаформа, если правильно понимаю, счетчик нельзя увеличить больше 4096. А у второго? Нет ограничения, или как?
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Семафоры
«
Ответ #1 :
Март 11, 2014, 23:18 »
А вы документацию (асистен) по Qt смотрели про класс QSemaphore?
Там для каждого метода показывается с комментариями изменение доступных "ресурсов"...
Записан
lss
Гость
Re: Семафоры
«
Ответ #2 :
Март 11, 2014, 23:42 »
Цитата: Old от Март 11, 2014, 23:18
А вы документацию (асистен) по Qt смотрели про класс QSemaphore?
Там для каждого метода показывается с комментариями изменение доступных "ресурсов"...
Смотрел. Если вы там видите ответ на мой вопрос, то ткните носом.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Семафоры
«
Ответ #3 :
Март 11, 2014, 23:48 »
Цитата: lss от Март 11, 2014, 23:42
Смотрел. Если вы там видите ответ на мой вопрос, то ткните носом.
Обратите внимание на комментарии.
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
Сообщений: 11445
Re: Семафоры
«
Ответ #4 :
Март 12, 2014, 07:31 »
"acquire all 5 resources" - каких "ресурсов"
Это просто означает что "меня пропустят через семафор если его счетчик >= 5 и при этом счетчик уменьшится". Думайте о семафоре как Вы его видели на ЖД. Горит красный - стоите ждете пока кто-то не включит синий. Тогда проезжаете и свет опять красный. А необходимость в счетчиках != 1 возникает крайне редко
Записан
lss
Гость
Re: Семафоры
«
Ответ #5 :
Март 12, 2014, 08:03 »
Цитата: Igors от Март 12, 2014, 07:31
"acquire all 5 resources" - каких "ресурсов"
Это просто означает что "меня пропустят через семафор если его счетчик >= 5 и при этом счетчик уменьшится"
И вот этот коментарий дорогого стоит (хоть и в кавычках):
Цитировать
"create" 10 new resources
Цитата: Igors от Март 12, 2014, 07:31
А необходимость в счетчиках != 1 возникает крайне редко
Какой-нибудь пример, для ясности, когда такая необходимость возникает, не могли бы привести?
«
Последнее редактирование: Март 12, 2014, 08:13 от lss
»
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Семафоры
«
Ответ #6 :
Март 12, 2014, 08:09 »
Цитата: Igors от Март 12, 2014, 07:31
"acquire all 5 resources" - каких "ресурсов"
Мда. Ну давайте на примере ЖД. Вокзал может одновременно принять 5 поездов, семафор устанавливается на число путей. Вот пути это как раз те самые ресурсы.
Цитата: Igors от Март 12, 2014, 07:31
А необходимость в счетчиках != 1 возникает крайне редко
Правильно, возникает редко, поэтому можно не разбираться, как работают семафоры. Так знания будут фундаментальней.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Семафоры
«
Ответ #7 :
Март 12, 2014, 08:13 »
Цитата: lss от Март 12, 2014, 08:03
И вот этот коментарий дорогого стоит (хоть и в кавычках):
Цитировать
"create" 10 new resources
Это означает в контексте примера с вокзалом, что на вокзале было пять путей, а потом перед олимпмадой достроили еще 10 и теперь вокзал может одновременно принять 15 поездов.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Семафоры
«
Ответ #8 :
Март 12, 2014, 08:20 »
Ну вот классическая задача "производитель-потребитель". Ясно что если производитель ничего не произвел - потребителю нечего потреблять, он и ждет на закрытом семафоре. И тут (предположим) у производителя как-то сразу образовалось аж 10 единиц продукции. Тогда ему разумно сделать release(10), в этом смысле и употребляется "create". Хотя семафору все равно есть ли там какие-то "ресурсы" - он просто открывается/закрывается. Теоретически и потребитель может заграбастать все 10, но обычно это невыгодно т.к. вся нагрузка упадет на одного потребителя.
Записан
lss
Гость
Re: Семафоры
«
Ответ #9 :
Март 12, 2014, 08:21 »
Цитировать
Мда. Ну давайте на примере ЖД. Вокзал может одновременно принять 5 поездов, семафор устанавливается на число путей. Вот пути это как раз те самые ресурсы.
А в коде, где эти пути (ресурсы)? Защищает такой семафор участок кода, зашёл в этот участок один поток, и, якобы, захватил сразу, один, какие-то пять ресурсов. Я понимаю ещё, если бы пять потоков зашли, каждый заход минус одно значение счётчика. Это всё равно, что в вашем примере, прошёл бы через семафор один поезд и сразу занял бы все пять путей.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Семафоры
«
Ответ #10 :
Март 12, 2014, 08:32 »
Цитата: lss от Март 12, 2014, 08:21
Я понимаю ещё, если бы пять потоков зашли, каждый заход минус одно значение счётчика. Это всё равно, что в вашем примере, прошёл бы через семафор один поезд и сразу занял бы все пять путей.
Так и есть, хотя я такого поезда никогда не видел
Проще так: счетчик семафора 5, значит он открыт. Когда через него пройдут 5 нормальных поездов - семафор закроется, следующие поезда будут ждать. Возможен какой-то "особый" поезд который сразу обнулит счетчик acquire(5), тогда семафор закроется сразу
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Семафоры
«
Ответ #11 :
Март 12, 2014, 08:33 »
Цитата: lss от Март 12, 2014, 08:21
А в коде, где эти пути (ресурсы)? Защищает такой семафор участок кода, зашёл в этот участок один поток, и, якобы, захватил сразу, один, какие-то пять ресурсов. Я понимаю ещё, если бы пять потоков зашли, каждый заход минус одно значение счётчика. Это всё равно, что в вашем примере, прошёл бы через семафор один поезд и сразу занял бы все пять путей.
Нуууу для примера, у нас есть 10 каналов связи, нитки могут захватывать их для обмена по очереди, причем нитке может понадобится один канал - просто принять/отправить, а может два - из одного канала передавать в другой.
Или несколько или все пути на вокзале закрыли на ремонт.
«
Последнее редактирование: Март 12, 2014, 08:38 от Old
»
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...