powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Соксы и многопоточность (WinSock & MultiThread)
7 сообщений из 7, страница 1 из 1
Соксы и многопоточность (WinSock & MultiThread)
    #33933753
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе утро дорогие коллеги.
Отлаживаю недавно собранное приложение, появились некоторые вопросы.

Есть нить(поток):
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 вроде отдавал ответ вовремя. Может не имеет смысла использовать синхронный сокет, а отдать предпочтение асинхронному.
Если у кого то есть соображения по этому поводу поделитесь пожалуйста.
...
Рейтинг: 0 / 0
Соксы и многопоточность (WinSock & MultiThread)
    #33935832
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DжеFF....Дело в том что при отладке работы например одной нити, вопросов не возникает, сокс создаеться, подключаеться или нет, выключаеться и удаляеться. Когда ставлю на тест 10 потоков все тоже вроде в норме, т.е. я вижу что приложение работает, двигаеться, если больше, то при отработке через определенный период времени приложение виснит, как бы, как будто ждет респонса на Connect, хотя при трассировки Connect вроде отдавал ответ вовремя....

я не видел в Вашем коде синхронные(!) фазы подъёма и шутдауна ниток...в многопоточности именно эти грабли лежат под ногами, когда ситуация с нагрузками на станции меняется. Либо по другому - нахфик вообще запускать нитки, если Вам пофигу их судьба ?

и ышо ремарка... с данными лучше работать следующим макаром... обёртка потока содержит все данные и разруливает подъём-опускание-передачу данных-синхронизацию между потоком чаилдом и парентными запросами...стандартный джэльменский набор - стоп, старт, шутдаун, пауза и т.д... дык вот, когда Вы говорите где то внедрах старта бегин - передавайте функции потока this, а внутри статики нечто (*threadClass)->Run(). В ране синхронные фазы инишиалайз, дэинишалайз, ну и сам вызов "глобал" ран. При этом заметьте сами данные находяться в классе и под них не нуна создавать структуры или классы оболочки... ну где то так..

возвращаясь к баранам...ошибка смахивает на проблемы описанные мною выше - отсутсвие синхронных фаз подьёма и шутдауна...


с уважением
(круглый)
...
Рейтинг: 0 / 0
Соксы и многопоточность (WinSock & MultiThread)
    #33936565
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Честно сказать, у меня мало опыта работы с потоками, и на момент прочтения вашего сообщений я не могу представить себе фазы подъема и спада, и честно говоря пока очень прозрачно себе это представляю.. но по моим ощущением дело как раз в соксах. Конечно я могу ошибаться..

Расскажите поподробней на тематику синхронных фаз...
...
Рейтинг: 0 / 0
Соксы и многопоточность (WinSock & MultiThread)
    #33937333
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DжеFF...Расскажите поподробней на тематику синхронных фаз...

Обычно потоки содержат ресурсы памяти либо ввода-вывода(сокеты, файлы, драйвера и т.д.). Зачастую ресурсы чуствительны к ПОТОКАМ их инициализирующих (БД например). Отсюда становиться понятно, что в дочерних потоках присутствует (иное встречается - но как правило реже) фаза инициализации своих данных(ресурсов), и это мероприятие может окончиться плачевно. Более того, операционка НЕ регламентирует очерёдность и временные кванты при выборе потоков, с момента бегин thread.

если Вы делаете многопоточный код и видите в отладчике, что при создании потока в него перешло управление и он выведя в консоль "хэйлохты мир!" заканчивается и после этого Ваша программа благополучно заканчивается (ну представим себе такой код)..То это НЕ значит, что она себя так же поведёт:
а) в релизе
б) при большей загрузке компа
в) при отсутствии окошечка консоли

а это значит, что Вы можете получить окончание программы РАНЬШЕ чем окончание потока (который может даже и не стартовал ышо!). При такой реализации имеем трудно улавливаемую, плавающую ошибку.

Тот же пример более правильно был бы:
а) проинициализировали элемент синхронизации из ядра оси.
б) запустили поток.
в) ожидаем на элементе синхронизации.
г) внутри потока ребёнка...1) проинициализировали переменные, проверили необходимое окружение для работы. 2) выставили код возврата родителю и просигналили родителю - что всё пучком. 3) перешли к работе контролируя флаг останова (ожидание на хэндлер(ах), проверка флага через промежуточный тайм-аут)
д) родитель... получив сигнал о начале работы ребёнка, проанализировали код возврата от ребёнка. если беда - обработка ситуёвины.
е) работаем...
ж) при шутдауне...выставляем сигнал окончания (шлём хэндлеру, либо выставляем флажок, либо ышо как).
з) внутри потока ребёнка...1) поймали признак (флаг) окончания работы. 2) очистили очередь (если такая есть) данных (либо обработали её). 3) освободили ресурсы. 4) выставили код ошибки паренту 5) окончили работу.
и) ждём на хэндлере самого потока (его мона использовать как признак останова нитки)..
к) считали код возврата - если беда, обработка...
л) закрываем хэндлер нитки ребёнка...
м) конец программы...

при таком сценарии взаимодействия ребёнок-отец имеем СИНХРОННЫЕ ФАЗЫ подъёма и опускания нитки-ребёнка. И данная логика работы НЕ зависит от тех причин которые были перечислены выше.

с уважением
(круглый)
ЗЫ
Рекомендую отличную книгу по Win32 "Windows для проффессионалов" Джэфри Рихтера. Там найдёте и про объекты синхронизации и про потоки, а так же много чаво интересного.
...
Рейтинг: 0 / 0
Соксы и многопоточность (WinSock & MultiThread)
    #33937847
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скачал, сижу читаю =)
Оч. интересно, спасибо)
...
Рейтинг: 0 / 0
Соксы и многопоточность (WinSock & MultiThread)
    #33937852
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати где бы ее заказать в бумажном переплете, не люблю я электронный формат... ?!
...
Рейтинг: 0 / 0
Соксы и многопоточность (WinSock & MultiThread)
    #33940694
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DжеFFКстати где бы ее заказать в бумажном переплете, не люблю я электронный формат... ?!

в мскве думаю, если зайдёте в библио глобус, что возле КГБ...либо на ленинском - дом тех. литературы...то не прогадаете..за одно может ещё что нить нароете...правда сам давно уже не был...к сожалению - всё никак не дойду...работа мать её..

(круглый)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Соксы и многопоточность (WinSock & MultiThread)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]