Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-1094725879
Bless
2004-09-09 14:31
2004.10.10
IBase ->MSSQL


14-1095948726
Zombie
2004-09-23 18:12
2004.10.10
Хочу FM-тюнер!!!


1-1096038896
AdmeraL
2004-09-24 19:14
2004.10.10
Tregistry


14-1095687816
setter
2004-09-20 17:43
2004.10.10
UnFDISK


1-1095702519
bloodman
2004-09-20 21:48
2004.10.10
Возможно ли при помощи TButton.perform сэмулировать зажатую...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский