В чем разница между pthread_self () и gettid ()?Какой из них я должен использовать? - PullRequest
23 голосов
/ 16 июня 2011

Я пытаюсь установить привязку процессора к потокам в Linux. Я хотел бы знать, какой из следующих подходов рекомендуется:

  1. Получить идентификатор потока с помощью pthread_self ()

    Установить привязку к процессору, используя pthread_setaffinity_np (....), передав идентификатор потока в качестве аргумента

  2. Получить идентификатор потока с помощью вызова gettid ()

    Установить привязку к процессору, используя sched_setaffinity (....), передав идентификатор потока вместо идентификатора процесса

P.S .: После установки привязки к ЦП я намереваюсь увеличить приоритет планирования потока.

Ответы [ 2 ]

19 голосов
/ 16 июня 2011

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

gettid

В Linux 2.4 появился новый системный вызов gettid(), позволяющий потоку получить собственный идентификатор потока.

Каждый поток в группе потоков отличается уникальным идентификатором потока. Идентификатор потока представлен с использованием того же типа данных, который используется для идентификатора процесса, pid_t. Идентификаторы потоков являются уникальными для всей системы, и ядро ​​гарантирует, что идентификаторы потоков не будут такими же, как любые идентификаторы процессов в системе, кроме случаев, когда поток является лидером группы потоков для процесса.

pthread_self

Каждый поток в процессе уникально идентифицируется по идентификатору потока. Поток может получить свой собственный идентификатор, используя pthread_self().

Функция pthread_equal() необходима для сравнения идентификаторов потоков, поскольку тип данных pthread_t должен рассматриваться как непрозрачные данные .

В реализациях потоков в Linux идентификаторы потоков уникальны для всех процессов. Тем не менее, это не обязательно имеет место в других реализациях, и SUSv3 явно отмечает, что приложение не может использовать идентификатор потока для идентификации потока в другом процессе .

gettid против pthread_self

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

Я бы пошел с pthread_setaffinity_np, но помните, что в руководстве написано:

Эти функции реализованы сверху sched_setaffinity (2)

0 голосов
/ 28 декабря 2012

Я считаю, что тот факт, что gettid() существует только как системный вызов и не был представлен напрямую как вызов API, может означать «используйте его, только если вы абсолютно уверены в том, что делаете», и gettid() не предназначен для переноски.

Тебе должно быть лучше, если ты придерживаешься pthread. Вы можете изменить политику планирования / приоритет позже с помощью pthread_setschedparam()

...