imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 30.03.2004, 14:39     # 1
miha
Guest
 
Сообщения: n/a

Question Откуда такие глюки при работе с потоками?

Проблема:

DWORD WINAPI _ThreadFunc(LPVOID lpParameter)
{
for( ;; ) {}
return 0;
}

...

HANDLE pThreads[100];

for(int i = 0; i < 100; ++i)
pThreads[i] = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)_ThreadFunc,
0,
0,
0);

Sleep(1000);

for(int i = 0; i < 100; ++i)
{
TerminateThread(pThreads[i], 0);
CloseHandle(pThreads[i]);
}
...

на первый взгляд данный фрагмент кода не содержит ничего предосудительного за исключением того, что микрософт НЕ РЕКОМНДУЕТ так делать в силу следующих причин:
- If the target thread owns a critical section, the critical section will not be released.
- If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread's process could be inconsistent.
- If the target thread is manipulating the global state of a shared DLL, the state of the DLL could be destroyed, affecting other users of the DLL.
Но как видно из примера ни одна из перечисленных причин для данного примера не актуальна.

Микрософт описывает поведение потока при вызове функции TerminateThread следующим образом:
If the target thread is the last thread of a process when this function is called, the thread's process is also terminated.
The state of the thread object becomes signaled, releasing any other threads that had been waiting for the thread to terminate. The thread's termination status changes from STILL_ACTIVE to the value of the dwExitCode parameter.
Terminating a thread does not necessarily remove the thread object from the system. A thread object is deleted when the last thread handle is closed.

ОДНАКО:
- периодическое выполнение данного фрагмента кода приводит к ДИКОЙ утечке памяти (TaskMenager->Mem Usage);
- через какое-то время вызовы функции API CreateThread перестают создавать потоки, сигнализируя своим возвращаемым значением об ошибке;
- данная проблемма актуальна для Windows 2000 sp3, Windows 2003 Server Enterprise;

Знающие люди, объясните в чем тут подвох!
Ибо подобное поведение означает: что любое приложение, создающее и уничтожающее потоки ОБРЕЧЕНО при длительной эксплуотации на завершение своей работы с ошибкой, хотя, если следовать документации, она работает с потоками КОРРЕКТНЫМ образом.
 


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 19:54.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.