PDA

Просмотр полной версии : Проблема с потоками


Chrome~
21.07.2009, 01:16
Подскажите, с чем это связано или все так и должно быть. В общем, я писал несколько программ, которые работают в несколько потоков, которые в свою очередь отправляют HTTP запросы. Отправляют запрос и сразу же обрывают соединение, не дожидаясь ответа. Таймауты между отправкой запросов - 100 мсек. Не понимаю, с чем это связано, но такая программа при 10 потоках на моем компе 3,41 ГГц очень начинает подвисать система. Да и еще при том, что потоки работают с Priority tpLowest. Я все делаю правильно, - потоки освобождают себя из памяти и т.п... Но никак не пойму, почему система начинает глючить. Или так должно быть?

K0rINf
21.07.2009, 04:14
Напеши все характеристика компа! и исходники выложи

_nic
21.07.2009, 10:34
Без исходников трудно предположить в чем проблема.Возможно они одновременно обращаются без синхронизации к каким то данным, то есть соперничают за доступ к ним.Оттудого и такая загрузка камня.

W!z@rD
21.07.2009, 11:37
типичный признак "бескоченого цикла" в котором есть какие-нибудь расчеты например.

slesh
21.07.2009, 13:55
У меня двухядерный 2,5 ГГц и держит запросто 1000 ожидающих потоков.
100 рабочий тоже держит и не грузит систему.
Так что у тебя дело только в реализации.
Помимо проверки циклов, еще обрати внимание на то как ты считываеш из сокета.
Если ты читаеш по 1 байту, то это будет давать весомую нагрузку.

FireFenix
21.07.2009, 23:48
Как продолжение размышлений о потоках:
Пишу программу под .NET... использую местами http запросы + regex ....
Какое оптимальное количество работающих потоков на .NET приложение? А то где-то вычитал, что оптимально 25*кол-во процессоров

МongBa†
22.07.2009, 02:34
Chrome~
Если работаешь с винсоками - мб забываеш освобождать WSA? (было как-то по невнимательности - через время тупо висла машина)

А вообще не вижу смысла в закрытии/высвобождении процессов после каждого запроса, почему бы не сделать постоянный процесс в котором постоянно отправляются запросы, закрывается соединение и заново?

W!z@rD
22.07.2009, 06:56
Как продолжение размышлений о потоках:
Пишу программу под .NET... использую местами http запросы + regex ....
Какое оптимальное количество работающих потоков на .NET приложение? А то где-то вычитал, что оптимально 25*кол-во процессоров

хых))
некоторые факторы:
1. мощность процессора
2. колл-во ядер
3. ширина канала
4. оптимальность паттерна
5. загруженность ОС без твоего приложения

это навскидку... Как ты собрался считать оптимальное колличество потоков?

>>оптимально 25*кол-во процессоров
В чем различие процесса от потока? И вообще что такое процессор?????

ппц =\
Вы там че, курите, мурзилку читаете, надписи на заборе? жуть...
советую еще это (http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx) взглянуть

FireFenix
22.07.2009, 10:21
Вы там че, курите, мурзилку читаете, надписи на заборе? жуть...
Ах нуда, нынче кучу мануалов по оптимизации потоковых приложений =)
И вообще что такое процессор?????
эта такая чтучка в которой много ног и транзисторов ^_^
А то где-то вычитал, что оптимально 25*кол-во процессоров
это относилось к 25*[кол-во (процессоров || ядер)]

Естественно предел памяти и системного времени никто отменял!

Algol
22.07.2009, 10:59
Не понимаю, с чем это связано, но такая программа при 10 потоках на моем компе 3,41 ГГц очень начинает подвисать система.

Какая ОС ? Если XP, то в ней ограничение на максимальное число конектов - 10.

slesh
22.07.2009, 11:55
Вообще мы что тут потомственные колдуны и гадалки чтоли? Чтобы думать что там может быть. А быть там может что угодно. мож он там глюканул с запуском потоков и их запускается неограничено пока есть ресурсы у компа. А мож банальное переполнение которое чтото вешает.

Короче код в студию! или хотябы кусок который запускает потоки и саму функцию поточную

geezer.code
22.07.2009, 13:12
имхо поллинг чистой воды. симптомы - налицо.

Chrome~
22.07.2009, 20:46
Спасибо всем кто ответил.
Какая ОС ? Если XP, то в ней ограничение на максимальное число конектов - 10.
Да у меня Windows XP, но не может быть, чтобы максимальное число подключений было 10. (Вроде как после установки программы FlashGet произошла модификация подключений и данного ограничения eу меня уже нету)

Ресурсы освобождаю. Не знаю, в чем проблема, но вот возьмите код одного из моих Request Sender. Я писал его для некоторых своих целей, и мне нужно было, что бы входные данные принимались в hex-кодировке.

То есть, что бы замутить такой запрос:
GET / HTTP/1.0
Host: antichat.ru


Передавать в программу нужно такие данные:
47 45 54 20 2F 20 48 54 54 50 2F 31 2E 30 0D 0A 48 6F 73 74 3A 20 61 6E 74 69 63 68 61 74 2E 72 75 0D 0A 0D 0A

Код простой, я думаю, у вас не возникнет сложностей. Протестируйте у себя на машине и скажите, что я не правильно написал.

Для работы с инетом программа использует только Winsock.

http://rapidshare.com/files/258782118/Source.rar
http://depositfiles.com/files/jx63lsxv2

bons
22.07.2009, 22:11
есть мнение что не надо в каждом потоке вызывать WSAStartup. Причем в количестве count раз

Chrome~
23.07.2009, 01:25
есть мнение что не надо в каждом потоке вызывать WSAStartup. Причем в количестве count раз
То есть перед созданием потоков сделать WSAStartup, а в конце программы - WSACleanUp?

RumShun
23.07.2009, 05:33
WSAStartup вызаваешь один раз, в начале рабоды проги, и закрываешь по выходу из нее, этого хватит, почитай статьи slesh, там это есть.