Форум: "WinAPI";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
ВнизСемафоры Найти похожие ветки
← →
Fktrc © (2004-09-03 12:18) [0]Всем привет!
Использую семафор для ограничения числа одновременно выполняемых потоков. Каким образом можно менять на ходу максимальное число ресурсов, контролируемое семафором, без перезапуска программы. Главное - чтобы даже те потоки, которые висят на WaitFor(Multiple|Single)Objects увидели изменение и соответственно либо продолжили ожидание, либо вышли из функции с результатом WAIT_OBJECT_0+х
Надоумьте, что мне сделать надо для такого результата.
← →
Digitman © (2004-09-03 12:35) [1]
> максимальное число ресурсов, контролируемое семафором
под "ресурсами" ты имеешь ввиду макс.значение счетчика, ассоциированного с семафором и задаваемое при его создании ?
← →
Fktrc © (2004-09-03 12:51) [2]Да.
← →
atruhin © (2004-09-03 12:59) [3]С помощью семафора никак. В книге Рихтера "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows" гл.10-11 описаны варианты организации своих синхронизирующих обьектов и пулов потоков. А вообще обычно достаточно в главном потоке, который распределяет задания, отслеживать необходимость создания дополнительного потока, обычно по времени от прихода последнего запроса, а в рабочем потоке после окончания задиния проверить кол-во потоков в пуле, длинну очереди задиний, время последней выборки и при ниобходимости закрыть поток.
← →
Игорь Шевченко © (2004-09-03 13:07) [4]
> Каким образом можно менять на ходу максимальное число ресурсов,
> контролируемое семафором, без перезапуска программы.
Никаким. У семафора нет метода изменения его максимального значения без пересоздания объекта.
← →
Digitman © (2004-09-03 13:08) [5]
> Каким образом можно менять на ходу максимальное число
никаким, наверно ... только создав новый семафор с нужным предельным значением счетчика .. а старый семафор уничтожить
Можно поступить так - "повесить" ждущие потоки на MsgWaitForMultipleObjects(), тем самым заствив их в момент ожидания реагировать на сообщения, посылаемые им (PostThreadMessage) или их окнам (Send/PostMessage) со стороны трэда, ответственного за создание/пересоздание семафора? используемого далее ждущими трэдами
тред, принявший решение о пересоздании семафора, пересоздает его с нужным сч-ком, посылает некое предопред.сообщение всем заинтересованным трэдам, сообщая параметром сообщения, например, имя нового семафора, после чего закрывает хэндл старого
трэды, получившее такое сообщене, так же закрывают хэндл старого семафора (как только все треды закроют этот хэндл, объект-семафор будет удален из системы), после чего выполняют OpenSemaphore(новый семафор), получая новый хэндл и вновь передавая его в MsgWaitForMultipleObjects для очередного ожидания
← →
Digitman © (2004-09-03 13:38) [6]если все это хоз-во крутится в контексте одного и того же процесса, можно параметром сообщения передавать готовый полученный хэндл нового семафора - тогда логика значительно упрощается
← →
Fktrc © (2004-09-03 13:48) [7]Всем спасибо.
2 Digitman: Отдельное спасибо за конструктивное предложение. Примерно это мне и приходило в голову, но до конца не оформилось, а про сообщения в потоки я и не знал. Попробую.
Хотя... а WaitForMultipleObjects, который следит за семафором и за каким нибудь событием (Events) одновременно не подойдет?
Типа так - освободилось локальное для потока событие ChangeMySemaphore с автосбросом, функция возвращает результат WAIT_OBJECT_0+1. Отловив этот результат, закрываем старый семафор, открываем новый и снова WaitForMultipleObjects.
Пример.
repeat
TwoObjects[1] := MaxCount; // передаем в массив новый хэндл, или прежний, если его не пересоздавали
WFMOResult := WaitForMultipleObjects (2, @TwoObjects, false, INFINITE); // ждем"с
if WFMOResult = WAIT_OBJECT_0+1 then begin // пришло событие "семафор пересоздан"
CloseHandle (TwoObjects[1]); // закрываем его старый хэндл, хранящийся в массиве
end;
until WFMOResult <> WAIT_OBJECT_0+1; // если сработало событие "Смена семафора", то прокрутить
// цикл еще раз
Так пойдет?
← →
Fktrc © (2004-09-03 13:48) [8]Удалено модератором
Примечание: Дубль
← →
Fktrc © (2004-09-03 13:49) [9]Прошу прощения, глюкнуло.
← →
Digitman © (2004-09-03 13:58) [10]
> Fktrc
ну можно и так ... сообщение потоку - лишь один из вариантов
← →
Fktrc © (2004-09-03 13:59) [11]//Digitman
Спасибо.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c