![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
api-потоки, создание-разрушение [D6, WinXP]
Незнайка Винидиктович © (2009-03-29 18:25:00)Вот такая проблема случилась: Пишу подобие сокс5-сервера, с сипользование winapi-потоков, т.е. при старте запускаеться отдельный поток в котором крутиться бесконечный цикл с Accept, и как только есть подключившийся сокет, он создает поток и передает этот сокет туда... Так вот странность какая, что вродебы никаких общих переменных нету, никакой синхронизации нету(за её ненадобностью), т.е. все потоки существуют отдельно друг от друга. Так вот откудато берется ошибка памяти ((
В потоке примерно вот такая штука крутиться:
while True do
begin
FD_Zero(FDSet);
FD_Set(srv_sock,FDSet);
//åñëè åñòü êëèåíò, òî ïåðåäàåì ñîêåò â êëèåíòñêèé ïîòîê
Select(0,@FDSet,nil,nil,@timeout);
if FD_IsSet(srv_sock,FDSet) then
begin
accepted_sock:=Accept(srv_sock,@Addr,@addr_size);
CreateThread(nil, 0, @cli_thread, pointer(accepted_sock), 0, h);
end;
end;
Так вот кстати, как правельно разрушать потоки???
изнутри ExitThread(0); недостаточно? или как это правельно вообще делаеться?
Сергей М. (2009-03-30 10:11:00) [61]
> строка локальная в поточной функции с помощью какого-то
> BMM евляеться общей ?
Да не строка общая, а ресурсы самого BMM !
Обращение к этим ресурсам происходит в момент неявных вызовов Get/Realloc/FreeMem, потенциально происходящих при использовании длинных строк. Причем фиолетово, локальные ли эти строковые переменные или не локальные.
Незнайка Винидиктович (2009-03-30 09:48:00) [62]хм. в BeginThread заголовок вроде идентичен с CreateThread, а вот параметр для функции некорректно воспринимает
Незнайка Винидиктович (2009-03-30 09:41:00) [63]Ну впринципе сейчас попробую переделать на БегинТред, посмотрим что из этого выйдет.
Незнайка Винидиктович (2009-03-30 09:38:00) [64]
> Так.Ресурсы BMM (Borland Memory Manager в составе Run-Time
> Library) как раз и есть общие.Работая с длинными строками
> ты неявно обращаешься к BMM и, соотв-но, к его ресурсам.
> Установка глобального флага IsMultiThread предписывает BMM
> при помощи крит.секции выстраивать в очередь явные или неявные
> запросы к нему со стороны потоков прикладного кода, это
> и есть та самая синхронизация, в которой у тебя якобы нет
> необходимости.
Немного в шоке оО
Т.е. даже если эта строка локальная в поточной функции с помощью какого-то BMM евляеться общей ??
нет я даже много в шоке )
Сергей М. (2009-03-30 09:34:00) [65]Так.
Ресурсы BMM (Borland Memory Manager в составе Run-Time Library) как раз и есть общие.
Работая с длинными строками ты неявно обращаешься к BMM и, соотв-но, к его ресурсам.
Установка глобального флага IsMultiThread предписывает BMM при помощи крит.секции выстраивать в очередь явные или неявные запросы к нему со стороны потоков прикладного кода, это и есть та самая синхронизация, в которой у тебя якобы нет необходимости.
Этот же флаг неявно взводится при вызове BeginThread, кр.того BeginThread делает еще несколько крайне полезных действий, направленных, например, на корректную и удобную обработку неперехваченных тобой исключений, потенциально могущих возникать в теле поточной функции.
Незнайка Винидиктович (2009-03-30 08:57:00) [66]
> > весь код немогу вставитьНе надо ничего никуда "вставлять".
> Потенциальный источник проблем :> никакой синхронизации
> нету(за её ненадобностью)Флаг IsMultiThread имеет прямое
> отношение к синхронизации.
Как я понимаю(при моём скромном опыте программирования), что синхронизация нужна только в том случае если потоки обращаютсья одновременно к общим ресурсам, так?
Сергей М. (2009-03-30 08:53:00) [67]
> использовал .. стринг
Ну вот тебе и грабли, как и просил)
Сергей М. (2009-03-30 08:48:00) [68]
> весь код немогу вставить
Не надо ничего никуда "вставлять".
Потенциальный источник проблем :
> никакой синхронизации нету(за её ненадобностью)
Флаг IsMultiThread имеет прямоеотношение к синхронизации.
Незнайка Винидиктович (2009-03-30 08:44:00) [69]
> Ну можно вообще просто считать вызовы GetMem/FreeMem (переопределить
> указатели на эти функции - это самое простое).
Так я вообще в своем приложении использовал только переменные интеджер и стринг впринципе...
Незнайка Винидиктович (2009-03-30 08:43:00) [70]
> > в представленом мной коде всего 13 строкА никто и не говорил
> что проблема в представленном коде.Проблема - в одной из
> 17-х строк в коде , который ты не представил.
безусловно это так, но весь код немогу вставить тут ограничение )) ну вообщемто проблема сейчас уже в другом (
Сергей М. (2009-03-30 08:22:00) [71]
> в представленом мной коде всего 13 строк
А никто и не говорил что проблема в представленном коде.
Проблема - в одной из 17-х строк в коде , который ты не представил.
Германн (2009-03-30 02:10:00) [72]
> мимо (30.03.09 01:48) [24]
>
> Ну можно вообще просто считать вызовы GetMem/FreeMem (переопределить
> указатели на эти функции - это самое простое).
>
Хм. Это уже мания,
Имхо. :)
мимо (2009-03-30 01:48:00) [73]Ну можно вообще просто считать вызовы GetMem/FreeMem (переопределить указатели на эти функции - это самое простое).
DVM (2009-03-30 00:55:00) [74]
> Незнайка Винидиктович (30.03.09 00:49) [21]
Можно для начала воспользоваться не MemProof, а FastMM4.
DVM (2009-03-30 00:53:00) [75]
> Да в диспетчере задач. смотрю в колонку память )
Смотри Виртуальную память, но все равно это не точно и неудобно, лучше использовать спец инструменты.
Незнайка Винидиктович (2009-03-30 00:49:00) [76]MemProof тоже показывает утечку, т.е. текущие и пиковые значения примерно равны... но как найти утечку пока не понял, вообщем в процессе поиска ))
Незнайка Винидиктович (2009-03-30 00:33:00) [77]
> Не факт, что утечка, где смотрите размер занимаемой памяти?
> В диспетчере задач? Если да, то в каком столбце? Лучше
> взять что-то вроде MemProof и смотреть там, покажет все
> утечки вплоть до строк в коде (если его правильно настроить)
Да в диспетчере задач. смотрю в колонку память ) Предложенный софт сейчас попробую, может что выйде из этого
DVM (2009-03-30 00:22:00) [78]
> размер приложения в процессе работы растет
Не факт, что утечка, где смотрите размер занимаемой памяти? В диспетчере задач? Если да, то в каком столбце? Лучше взять что-то вроде MemProof и смотреть там, покажет все утечки вплоть до строк в коде (если его правильно настроить)
DVM (2009-03-30 00:19:00) [79]
> мимо (30.03.09 00:04) [14]
> Где там указатель? Там приведение типа SOCKET к типу Pointer.
> Никакого указателя там нет.
Да все верно, че-то я перепутал. Мне почему то казалось что там написано типа такого: pointer(@accepted_sock)
Уж не знаю, с чего я так решил.
Незнайка Винидиктович (2009-03-30 00:17:00) [80]
> > размер приложения в процессе работы растетГде-то утечка
> памяти.
Извините конечно за глупость, но как её искать? )