|
|
|
Соксы и многопоточность (WinSock & MultiThread)
|
|||
|---|---|---|---|
|
#18+
Доброе утро дорогие коллеги. Отлаживаю недавно собранное приложение, появились некоторые вопросы. Есть нить(поток): DWORD WINAPI ThreadProc( LPVOID lpParam ) { HANDLE hStdout; PMYDATA pData; char buff[1024] = "\0"; DWORD dwChars; hStdout = GetStdHandle(STD_OUTPUT_HANDLE); if( hStdout == INVALID_HANDLE_VALUE ) return 1; // Cast the parameter to the correct data type. pData = (PMYDATA)lpParam; // Print the parameter values using thread-safe functions. CTSocket *socket = new CTSocket; socket ->Close(); delete socket; // Free the memory allocated by the caller for the thread // data structure. ............................... ............................... HeapFree(GetProcessHeap(), 0, pData); return 0; } CTSocket обертка для работы с синхронными SOCKET. Дело в том что при отладке работы например одной нити, вопросов не возникает, сокс создаеться, подключаеться или нет, выключаеться и удаляеться. Когда ставлю на тест 10 потоков все тоже вроде в норме, т.е. я вижу что приложение работает, двигаеться, если больше, то при отработке через определенный период времени приложение виснит, как бы, как будто ждет респонса на Connect, хотя при трассировки Connect вроде отдавал ответ вовремя. Может не имеет смысла использовать синхронный сокет, а отдать предпочтение асинхронному. Если у кого то есть соображения по этому поводу поделитесь пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 10:21 |
|
||
|
Соксы и многопоточность (WinSock & MultiThread)
|
|||
|---|---|---|---|
|
#18+
DжеFF....Дело в том что при отладке работы например одной нити, вопросов не возникает, сокс создаеться, подключаеться или нет, выключаеться и удаляеться. Когда ставлю на тест 10 потоков все тоже вроде в норме, т.е. я вижу что приложение работает, двигаеться, если больше, то при отработке через определенный период времени приложение виснит, как бы, как будто ждет респонса на Connect, хотя при трассировки Connect вроде отдавал ответ вовремя.... я не видел в Вашем коде синхронные(!) фазы подъёма и шутдауна ниток...в многопоточности именно эти грабли лежат под ногами, когда ситуация с нагрузками на станции меняется. Либо по другому - нахфик вообще запускать нитки, если Вам пофигу их судьба ? и ышо ремарка... с данными лучше работать следующим макаром... обёртка потока содержит все данные и разруливает подъём-опускание-передачу данных-синхронизацию между потоком чаилдом и парентными запросами...стандартный джэльменский набор - стоп, старт, шутдаун, пауза и т.д... дык вот, когда Вы говорите где то внедрах старта бегин - передавайте функции потока this, а внутри статики нечто (*threadClass)->Run(). В ране синхронные фазы инишиалайз, дэинишалайз, ну и сам вызов "глобал" ран. При этом заметьте сами данные находяться в классе и под них не нуна создавать структуры или классы оболочки... ну где то так.. возвращаясь к баранам...ошибка смахивает на проблемы описанные мною выше - отсутсвие синхронных фаз подьёма и шутдауна... с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 18:54 |
|
||
|
Соксы и многопоточность (WinSock & MultiThread)
|
|||
|---|---|---|---|
|
#18+
Честно сказать, у меня мало опыта работы с потоками, и на момент прочтения вашего сообщений я не могу представить себе фазы подъема и спада, и честно говоря пока очень прозрачно себе это представляю.. но по моим ощущением дело как раз в соксах. Конечно я могу ошибаться.. Расскажите поподробней на тематику синхронных фаз... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 10:27 |
|
||
|
Соксы и многопоточность (WinSock & MultiThread)
|
|||
|---|---|---|---|
|
#18+
DжеFF...Расскажите поподробней на тематику синхронных фаз... Обычно потоки содержат ресурсы памяти либо ввода-вывода(сокеты, файлы, драйвера и т.д.). Зачастую ресурсы чуствительны к ПОТОКАМ их инициализирующих (БД например). Отсюда становиться понятно, что в дочерних потоках присутствует (иное встречается - но как правило реже) фаза инициализации своих данных(ресурсов), и это мероприятие может окончиться плачевно. Более того, операционка НЕ регламентирует очерёдность и временные кванты при выборе потоков, с момента бегин thread. если Вы делаете многопоточный код и видите в отладчике, что при создании потока в него перешло управление и он выведя в консоль "хэйлохты мир!" заканчивается и после этого Ваша программа благополучно заканчивается (ну представим себе такой код)..То это НЕ значит, что она себя так же поведёт: а) в релизе б) при большей загрузке компа в) при отсутствии окошечка консоли а это значит, что Вы можете получить окончание программы РАНЬШЕ чем окончание потока (который может даже и не стартовал ышо!). При такой реализации имеем трудно улавливаемую, плавающую ошибку. Тот же пример более правильно был бы: а) проинициализировали элемент синхронизации из ядра оси. б) запустили поток. в) ожидаем на элементе синхронизации. г) внутри потока ребёнка...1) проинициализировали переменные, проверили необходимое окружение для работы. 2) выставили код возврата родителю и просигналили родителю - что всё пучком. 3) перешли к работе контролируя флаг останова (ожидание на хэндлер(ах), проверка флага через промежуточный тайм-аут) д) родитель... получив сигнал о начале работы ребёнка, проанализировали код возврата от ребёнка. если беда - обработка ситуёвины. е) работаем... ж) при шутдауне...выставляем сигнал окончания (шлём хэндлеру, либо выставляем флажок, либо ышо как). з) внутри потока ребёнка...1) поймали признак (флаг) окончания работы. 2) очистили очередь (если такая есть) данных (либо обработали её). 3) освободили ресурсы. 4) выставили код ошибки паренту 5) окончили работу. и) ждём на хэндлере самого потока (его мона использовать как признак останова нитки).. к) считали код возврата - если беда, обработка... л) закрываем хэндлер нитки ребёнка... м) конец программы... при таком сценарии взаимодействия ребёнок-отец имеем СИНХРОННЫЕ ФАЗЫ подъёма и опускания нитки-ребёнка. И данная логика работы НЕ зависит от тех причин которые были перечислены выше. с уважением (круглый) ЗЫ Рекомендую отличную книгу по Win32 "Windows для проффессионалов" Джэфри Рихтера. Там найдёте и про объекты синхронизации и про потоки, а так же много чаво интересного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 13:08 |
|
||
|
Соксы и многопоточность (WinSock & MultiThread)
|
|||
|---|---|---|---|
|
#18+
Скачал, сижу читаю =) Оч. интересно, спасибо) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 15:10 |
|
||
|
Соксы и многопоточность (WinSock & MultiThread)
|
|||
|---|---|---|---|
|
#18+
Кстати где бы ее заказать в бумажном переплете, не люблю я электронный формат... ?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 15:10 |
|
||
|
Соксы и многопоточность (WinSock & MultiThread)
|
|||
|---|---|---|---|
|
#18+
DжеFFКстати где бы ее заказать в бумажном переплете, не люблю я электронный формат... ?! в мскве думаю, если зайдёте в библио глобус, что возле КГБ...либо на ленинском - дом тех. литературы...то не прогадаете..за одно может ещё что нить нароете...правда сам давно уже не был...к сожалению - всё никак не дойду...работа мать её.. (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2006, 15:52 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=338&tid=2030636]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
39ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 365ms |

| 0 / 0 |
