![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 5 Всего: 50 |
Использую семафор для лимитирование кол-ва потоков.
Как динамически измененять кол-во потоков? Как такое можно сделать? Т.е. после создания семафора ф-ей
надо изменить (увеличить, уменьшить) кол-во работающих потоков |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: нет Всего: 306 |
ReleaseSemaphore
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
ReleaseSemaphore добавляет единицу к значению семафора. Если у тебя потоки создаются в отдельном потоке-фабрике, который ожидает на WaitForSingleObject , то после сигнализации WaitForSingleObject разбудит поток-фабрику и та родит новый поток.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 5 Всего: 50 |
ReleaseSemaphore - это увеличить. А как уменьшить?
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 5 Всего: 50 |
Так оно и есть |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
По этой теме есть оч. хорошая книжка Рихтера. Последнее издание называется Windows via С/С++ . Но подойдет и более старое издание. Тема управления потоками и объектами синхронизации раскрыта отлично.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Alca |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 5 Всего: 50 |
Это сообщение отредактировал(а) Alca - 4.2.2010, 11:44 |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Alca, может устанавливается значение выше чем liMaxCount?
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Alca |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 5 Всего: 50 |
Да, было дело. -------- Надо увеличить кол-во потоков. Сначала ставлю семафор на 4 потока
Потом пытаюсь увеличить на 2, т.е. устанавливаю 6:
В диспечере задач кол-во потоков увеличилось только на единицу, хотя я сбросил семафор на 2-ку. Эссерт не срабатывает. ![]() Это сообщение отредактировал(а) Alca - 4.2.2010, 13:22 |
||||||
|
|||||||
Alexeis |
|
||||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Чтобы можно было 6 нужно
А, вообще, почему бы не поставить сразу 64? или 128?
Чтобы уменьшить число запущенных потоков нужно просто завершить один из них. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 5 Всего: 50 |
Alexeis, спасибо. Увеличивать число потоков получилось.
А уменьшить кол-во потоков не получается. Завершил я N-ое кол-во "лишних" потоков, но их число не уменьшилось (смотрел в диспетчер задач), т.к. запустилась следующяя партия потоков, стоящих в очереди.
Добавлено через 11 минут и 5 секунд ![]() |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Чтобы завершить поток достаточно позволить функции потока выполниться до конца. Если это пул потоков, то скорее всего имеется бесконечный цикл, который нужно прервать, а в потоке-фабрике дождаться полного завершения при помощи WaitForSingleObject(ThreadHandle, 1000) . После этого можно быть уверенным что поток завершился корректно. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 5 Всего: 50 |
Alexeis, именно так я и делаю, в это методе все реализовано:
Добавлено через 51 секунду Потоки завершаются, смотрел лог. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Ну раз завершаются значит все в порядке ![]() -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 5 Всего: 50 |
Но у меня при завершении потока срабатывае колбэк функция, в этой ф-ии я делаю:
Следовательно, потом запускаются следующие потоки, стоящие в очереди. Т.е. мне надо как-то уменьшить барьер (кол-во работающих потоков), как это сделать? Или может все-таки соорудить семафор на ивентах, такое реально? |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Заблокировать вызов callback функции (в данном случае) |
||||
|
|||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 5 Всего: 50 |
А как насчет ивентов, можно ли реализовать класс с соответствующим функционалом?
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Конечно можно из эвентов сделать семафор, и из семафора можно сделать эвент. А еще можно топором брится, вот только зачем? Семафор, сделанный из эвентов, будет работать так же, как и натуральный ![]() А функционал семафора в данном случае наиболее точно подходит для реализации функционала класса пула потоков. А для динамической модификации количества потоков в пуле очевидно должна быть поддержка и в самих потоках |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 5 Всего: 50 |
То есть? |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Тоесть поток должен отличать ситуацию, когда он просто завершился, потому что закончился Job, который ему передали и надо запускать следующий Job, от ситуации, когда поток завершают, что бы уменьшить количество потоков в пуле. Тогда следующий Job запускать не нужно |
||||
|
|||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 5 Всего: 50 |
xvr, ясно
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |