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