Ответ 1
Они не совпадают. Вот некоторые бит, которые я собрал из TLPI (я не смог найти достаточно большой блок, который полностью описывает это). Если вы спешите, вам, вероятно, нужна только последняя часть.
gettid
Linux 2.4 представил новый системный вызов gettid()
, чтобы поток мог получить собственный идентификатор потока.
Каждый поток в группе потоков отличается уникальным идентификатором потока. Идентификатор потока представлен с использованием того же типа данных, который используется для идентификатора процесса, pid_t
. Идентификаторы потоков уникальны для всей системы, и ядро гарантирует, что ни один идентификатор потока не будет таким же, как любой идентификатор процесса в системе, за исключением случаев, когда поток является лидером группы потоков для процесса.
pthread_self
Каждый поток в процессе уникально идентифицируется идентификатором потока. Поток может получить свой собственный идентификатор, используя pthread_self()
.
Функция pthread_equal()
необходима для сравнения идентификаторов потоков, поскольку тип данных pthread_t
должен рассматриваться как непрозрачные данные.
В реализациях потоковой передачи в Linux идентификаторы потоков уникальны для всех процессов. Однако это не обязательно относится к другим реализациям, а SUSv3 явно отмечает, что приложение не может переносимо использовать идентификатор потока для идентификации потока в другом процессе.
gettid
vs pthread_self
Идентификаторы потоков POSIX не совпадают с идентификаторами потоков, возвращаемыми системным вызовом gettid()
для Linux. Идентификаторы потоков POSIX назначаются и поддерживаются реализацией потоков. Идентификатор потока, возвращаемый gettid()
, представляет собой число (похожее на идентификатор процесса), назначенное ядром.
Я бы пошел с pthread_setaffinity_np
, но имейте в виду, что в руководстве написано:
Эти функции реализованы сверху из расписания (2)