Остается ли идентификатор потока уникальным/действительным, пока открыты какие-либо дескрипторы потока?

Если у меня есть поток Win32, я ссылаюсь на него через дескриптор и также могу получить его идентификатор потока.

дескриптор остается действительным и может использоваться пока я не закрою дескриптор, даже если поток был завершен. (В противном случае нельзя было бы использовать, например, GetExitCodeThread

Однако кажется, что в документах не всегда упоминается, что «происходит» с идентификатором потока после завершения потока, но до тех пор, пока кто-то все еще удерживает дескриптор потока для завершенного потока.

В дескрипторы и идентификаторы потоков указано, что

Идентификаторы действительны с момента создания потока до его завершения.

Когда мы затем посмотрим на GetThreadId API, мы можем задаться вопросом, что он должен был бы вернуть для завершенного потока, если бы идентификатор был действителен только до завершения потока. (А также на этом сайте есть пользовательский комментарий: «Неверно. Пока есть открытый дескриптор потока, его идентификатор потока по-прежнему действителен и уникален». Что действительно отвечает на этот здесь вопрос утвердительно, но не более того. контекст я осторожен.)

Кроме того, я нашел этот фрагмент в ответе здесь на SO:

ID — это уникальный числовой идентификатор потока, работающего в системе. Дескриптор потока, как и любой дескриптор объекта ядра, можно рассматривать как особый тип указателя с подсчетом ссылок на объект ядра.

Если это правильно и идентификатор потока действительно является идентификатором объекта ядра, то, по-видимому, потребуется, чтобы этот идентификатор оставался действительным, пока открыты какие-либо дескрипторы (поскольку объект ядра должен оставаться там для запроса).

Здравы ли мои рассуждения? Действителен ли идентификатор потока, пока открыты какие-либо дескрипторы? Существуют ли какие-либо документы MS или авторитетная книга, в которых явно указано одно или другое?


person Martin Ba    schedule 13.02.2013    source источник


Ответы (1)


Обратите внимание, что:

Таким образом, идентификатор можно повторно использовать только после закрытия последнего дескриптора потока (то есть ваше предположение верно).

person Roman R.    schedule 13.02.2013
comment
Что ж. Хм. (1) на самом деле сказать обратное (пока ... не кончится), нет? / (2) Да, я искал источник для этого. У тебя есть? / (3) Да, все API каким-то образом подразумевают, что ответ, кажется, да. - person Martin Ba; 14.02.2013
comment
Это не наоборот, скорее неточно. При условии, что поиск обратного дескриптора все еще работает в завершенном ThreadProc, время жизни идентификатора потока такое же, как и у самого объекта krrnel. - person Roman R.; 14.02.2013
comment
Можете ли вы предоставить ссылку для поддержки вашего второго пункта: идентификатор потока остается постоянным до тех пор, пока последний дескриптор этого потока не будет закрыт? - person Brian White; 07.02.2017
comment
@BrianWhite: это происходит из № 3 и № 1 (частично) выше. Пока поток существует, его идентификатор не может быть изменен, иначе владельцы идентификаторов не смогут выполнить поиск по идентификатору. Может быть неуклюжее предположение, что идентификатор меняется, но поиск с использованием старого идентификатора все еще работает, но я не могу придумать какой-либо рациональной причины, по которой это могло бы быть спроектировано таким образом. На самом деле все очень просто: поток создается и ему присваивается уникальный идентификатор, который остается постоянным на протяжении всего времени существования потока. - person Roman R.; 07.02.2017
comment
В дополнение к приведенным выше цитатам в связанной статье MSDN говорится: Идентификаторы действительны. с момента создания потока до его завершения.. Валидность означает доступность для поиска дескриптора, поэтому она действительно постоянна. - person Roman R.; 07.02.2017