Подтвердить что ты не робот

В чем разница между pthread_self() и gettid()? Какой из них я должен использовать?

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

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

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

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

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

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

4b9b3361

Ответ 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)

Ответ 2

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

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