Re[4]: handle
От: Polosaty Беларусь  
Дата: 05.04.02 05:46
Оценка: 3 (1)
Здравствуйте Dancer, Вы писали:

D>Здравствуйте Polosaty, Вы писали:


P>>Здравствуйте adontz, Вы писали:


A>>>Здравствуйте Dancer, Вы писали:


A>>>На выходе убивай поток TerminateThread, так, на всякий случай.

P>>Настоятельно не рекомендуется так делать, поток должен завершаться корректно. А с остальным согласен. Проблема в том, что не завершается поток и, следовательно, процесс. И не забывайте делать CloseHandle, правила хорошего тона все-таки стОит соблюдать.

D>А что, разве когда объект CWinThread уничтожается, его handle не освобождается автоматически?

Так сложилось, что я не использую MFC для программирования потоков. Поэтому мне приходится делать CloseHandle ручками. Если его делает MFC — на здоровье.
Кстати, закрытие хэндла с помощью CloseHandle и освобождение хэндла — не одно и то же с точки зрения ОС. Главное, что делает CloseHandle — декремент счетчика привязок объекта. Это не означает, что хэндл будет освобожден тут же. Хэндл освобождается, когда счетчик привязок станет равным нулю (т.е. когда все потоки, пользующие, например, семафор, сделают CloseHandle, или когда все потоки, получившие каким-то образом хэндл другого потока, т.е. икрементировавшие счетчик привязок объекта, сделают CloseHandle и сам поток завершится и т.д.)

D>И вообще, по-русски handle — это что (переводится вроде как "описатель")? И чем функционально отличается от указателя на объект? Многие ф-ции типа GetExitCodeThread принимают в качестве параметра, идентифицирующего объект, его handle, а не указатель. Почему?

Хэндл функционально действительно подобен указателю, но имеет дополнительные свойства. Главные из дополнительных свойств таковы:
1) указатель актуален в пределах адресного пространства одного процесса, ну а хэндл можно пользовать (если грамотно) в разных процессах, в т.ч. наследовать. Правда, при этом в разных процессах значение одного и того же хэндла может быть разным;
2) хэндл может быть актуален даже тогда, когда описываемый им объект (как ты правильно заметил, хэндл по-русски — описатель) перестал существовать (например, когда поток завершился, хэндл может быть еще не освобожден и с его помощью можно получит код возврата потока).

Хэндл — это описатель объекта ядра ОС. Каждый объект ядра имеет структуру, его описывающую, которая, в частности, включает и счетчик привязок. Используя для доступа к объекту ядра хэндл и функции API, программер не должен думать и не может забыть об инкременте или декременте счетчика привязок, об удалении объекта ядра, если его счетчик привязок стал равен 0 и т.д.

Ну а на самом деле хэндл — это индекс в таблице процесса, которая содержит указатели на эти самые структуры, описывающие объекты ядра. Структура этой таблицы — закрытая информация, но ее можно представлять себе так. В таблице присутствуют 4 столбца:
1. индекс (т.е. значение хэндла);
2. указатель на блок памяти ядра (т.е. ту самую структуру, описывающую объект ядра);
3. маска доступа;
4. набор битовых флагов.

Вообще, лучше всего на эту тему почитать Рихтера. Собственно, практически вся привденная мной информация взята оттуда.
Re[5]: handle
От: Dancer Россия  
Дата: 05.04.02 06:34
Оценка:
Здравствуйте Polosaty, Вы писали:

P>Здравствуйте Dancer, Вы писали:


D>>Здравствуйте Polosaty, Вы писали:


P>>>Здравствуйте adontz, Вы писали:


A>>>>Здравствуйте Dancer, Вы писали:


A>>>>На выходе убивай поток TerminateThread, так, на всякий случай.

P>>>Настоятельно не рекомендуется так делать, поток должен завершаться корректно. А с остальным согласен. Проблема в том, что не завершается поток и, следовательно, процесс. И не забывайте делать CloseHandle, правила хорошего тона все-таки стОит соблюдать.

D>>А что, разве когда объект CWinThread уничтожается, его handle не освобождается автоматически?

P>Так сложилось, что я не использую MFC для программирования потоков. Поэтому мне приходится делать CloseHandle ручками. Если его делает MFC — на здоровье.
P>Кстати, закрытие хэндла с помощью CloseHandle и освобождение хэндла — не одно и то же с точки зрения ОС. Главное, что делает CloseHandle — декремент счетчика привязок объекта. Это не означает, что хэндл будет освобожден тут же. Хэндл освобождается, когда счетчик привязок станет равным нулю (т.е. когда все потоки, пользующие, например, семафор, сделают CloseHandle, или когда все потоки, получившие каким-то образом хэндл другого потока, т.е. икрементировавшие счетчик привязок объекта, сделают CloseHandle и сам поток завершится и т.д.)

D>>И вообще, по-русски handle — это что (переводится вроде как "описатель")? И чем функционально отличается от указателя на объект? Многие ф-ции типа GetExitCodeThread принимают в качестве параметра, идентифицирующего объект, его handle, а не указатель. Почему?

P>Хэндл функционально действительно подобен указателю, но имеет дополнительные свойства. Главные из дополнительных свойств таковы:
P>1) указатель актуален в пределах адресного пространства одного процесса, ну а хэндл можно пользовать (если грамотно) в разных процессах, в т.ч. наследовать. Правда, при этом в разных процессах значение одного и того же хэндла может быть разным;
P>2) хэндл может быть актуален даже тогда, когда описываемый им объект (как ты правильно заметил, хэндл по-русски — описатель) перестал существовать (например, когда поток завершился, хэндл может быть еще не освобожден и с его помощью можно получит код возврата потока).

P>Хэндл — это описатель объекта ядра ОС. Каждый объект ядра имеет структуру, его описывающую, которая, в частности, включает и счетчик привязок. Используя для доступа к объекту ядра хэндл и функции API, программер не должен думать и не может забыть об инкременте или декременте счетчика привязок, об удалении объекта ядра, если его счетчик привязок стал равен 0 и т.д.


P>Ну а на самом деле хэндл — это индекс в таблице процесса, которая содержит указатели на эти самые структуры, описывающие объекты ядра. Структура этой таблицы — закрытая информация, но ее можно представлять себе так. В таблице присутствуют 4 столбца:

P>1. индекс (т.е. значение хэндла);
P>2. указатель на блок памяти ядра (т.е. ту самую структуру, описывающую объект ядра);
P>3. маска доступа;
P>4. набор битовых флагов.

P>Вообще, лучше всего на эту тему почитать Рихтера. Собственно, практически вся привденная мной информация взята оттуда.


Спасибо, круто!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.