2013-05-17 4 views
2

, согласно моему пониманию, TID (идентификатор потока), возвращенный gettid(), уникален внутри процесса (или внутри программы с несколькими процессами, в то время как каждый процесс может иметь несколько потоки), а именно внутри процесса, другой поток имеет другой идентификатор потока.разница между значением, возвращаемым pthread_self() и gettid()

TID возвращаемый pthread_self() является уникальным в различных процессах, а именно, на той же машине, другой поток имеет различный TID на той же машине, в то же время.

Является ли мое понимание правильным или нет?

кроме того, как можно получить нить TID (соответствует gettid()) ее производной резьбы? спасибо!

+2

'gettid()' возвращает что-то совершенно иное, чем 'pthread_self()', хотя оба идентифицируют один и тот же поток. – alk

+2

[** В чем разница между pthread_self() и gettid()? Какой я должен использовать? **] (http://stackoverflow.com/questions/6372102/whas-is-the-difference-between-pthread-self-and-gettid-which-one-should-iu) –

+0

@ GrijeshChauhan: Зависит от того, чего вы хотите достичь ... ;-) – alk

ответ

1

pthread_self() возвращает уникальный идентификатор pthread-общесистемного процесса.

gettid() возвращает уникальный уникальный идентификатор потока (для Linux).


TID (идентификатор потока), возвращаемый gettid() является уникальным внутри процесса

Да.

(или внутри программы с несколькими процессами,

да.

внутри процесса, другой поток имеет различный идентификатор потока.

Да.

TID, возвращаемый pthread_self() является уникальным в различных процессах,

Номер

другой поток имеет различные TID на той же машине, в то же время.

Да в том же процессе, нет по всей машине.


Как gettid() является Linux специфичны и поэтому не портативный, единственный способ системы широко определить PTHREAD является использование его (для всей системы уникальный) идентификатор родительского процесса, возвращаемый getpid() вместе с его (процесс в масштабах всей уникальной) pthread-id, возвращаемый pthread_self().

+0

Я знаю это, просто хочу узнать больше деталей, которые в моих вопросах – misteryes

+0

@misteryes: Что не в моем ответе, что вы хотите знать? – alk

+0

Является ли мое понимание правильным или нет? Как поток может получить TID (соответствует gettid()) его производного потока? – misteryes

2

Нанести немного контекста реализации на этот вопрос, на Linux:

  1. gettid() возвращает значение, соответствующее вход волоска в процессе ядра планировщика (очень похож на то, что GETPID() является воспринимается как). Это то, на что можно ориентировать приоритеты и сродство.

  2. pthread_self() возвращает указатель на окрестности слота TLS (потокового локального хранилища) вызывающего потока на карте памяти процесса. Очевидно, что по определению того, что такое TLS, это значение уникально в рамках данного процесса (и может быть отображено на TID ядра и обратно), но оно не может быть уникальным для всей системы, потому что каждый процесс имеет один и тот же диапазон виртуальных адресов.

+0

Обратите внимание, что в Linux, gettid() - это ТОЛЬКО значение, указанное командами unix «top», «htop», «pidstat -t» и «ps -ef». Это помогает разработчикам соотносить сложный процесс с конкретным потоком. Инструмент «pidstat -t» поможет определить чрезмерное переключение потоков. –

2

В моих наблюдениях pthread_self() НЕ является уникальным в процессе. Уникально в любой момент времени. Но когда потоки завершаются, а другие потоки запускаются во время процесса, , они могут повторно использовать значения pthread_self(), которые ранее использовались другими потоками.

+1

«... наблюдения' pthread_self' НЕ уникальны в процессе »- правильно. Его документировано в [pthread_self (3)] (http: //linux.die.net/man/3/pthread_self): «Идентификатор потока может быть повторно использован после присоединения завершенного потока или завершен отдельный поток». – jww

Смежные вопросы