Поскольку pthread
s не нужно реализовывать с потоками Linux (или вообще с потоками ядра), а некоторые реализации полностью пользовательские или смешанные, интерфейс pthread
s не предоставляет функций получить доступ к этим деталям реализации, так как они не будут переносимы (даже при реализации pthread
в Linux). Библиотеки потоков, использующие их, могут предоставить это в качестве расширения, но, похоже, не существует ни одной из них.
Помимо доступа к внутренним структурам данных библиотеки потоков (что, по понятным причинам, вам не нужно, хотя, учитывая ваши предположения о сродстве процессоров и идентификаторах потоков Linux, ваш код в любом случае не будет переносимым), вы, возможно, сможете подшутить во время создания, если вы управляете кодом, который создает потоки:
Дайте pthread_create()
функцию ввода, которая вызывает gettid()
(что, кстати, вам, вероятно, придется делать с использованием макроса syscall
напрямую, поскольку он не всегда экспортируется libc
), сохраняет результат где-то , а затем вызывает исходную функцию ввода. Если у вас несколько потоков с одной и той же функцией ввода, вы можете передать инкрементный указатель в массив в аргументе arg
в pthread_create
, который затем будет передан в функцию ввода, созданную вами для хранения идентификатора потока. Store pthread_t
возвращает значение pthread_create
в том же порядке, и тогда вы сможете искать идентификаторы потоков Linux всех созданных вами потоков по их значению pthread_t
.
Стоит ли этот трюк, зависит от того, насколько важна настройка соответствия ЦП в вашем случае, в отличие от отсутствия доступа к внутренним структурам библиотеки потоков или от библиотеки потоков, предоставляющей pthread_setaffinity_np
.