Linux repositories inspector

pthread_setaffinity_np(3) - Russkiy

Linux
2019-03-06
Aliases: pthread_getaffinity_np(3), pthread_getaffinity_np(3), pthread_getaffinity_np(3), pthread_getaffinity_np(3), pthread_getaffinity_np(3), pthread_getaffinity_np(3)

man-pages-ru

Russian man pages from the Linux Documentation Project

manpages-dev

Manual pages about using GNU/Linux for development

man-pages

Linux kernel and C library user-space interface documentation

ИМЯ

pthread_setaffinity_np, pthread_getaffinity_np - получить/назначить увязываемый ЦП для нити

ОБЗОР

#define _GNU_SOURCE             /* Смотрите feature_test_macros(7) */
#include <pthread.h>

int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset); int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset);
Компилируется и компонуется вместе с -pthread.

ОПИСАНИЕ

Функция pthread_setaffinity_np() устанавливает маску увязывания ЦП для нити thread равной набору ЦП, указанному в cpuset. Если вызов выполняется без ошибок и нить не запущена ни на одном из ЦП в cpuset, то она перемещается на один из этих ЦП.
Функция pthread_getaffinity_np() помещает маску увязывания ЦП для нити thread в буфер, на который указывает cpuset.
Дополнительную информацию по маскам увязывания ЦП смотрите в sched_setaffinity(2). Описание набора макросов, которые можно использовать для просмотра и изменения наборов ЦП, смотрите в CPU_SET(3).
В аргументе cpusetsize указывается длина буфера (в байтах), на который указывает cpuset. Обычно, этот аргумент должен задаваться как sizeof(cpu_set_t) (он может иметь и другое значение, если используются макросы динамического выделения набора ЦП, описанные в CPU_SET(3)).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении эти функции возвращают 0; при ошибке возвращается ненулевой номер ошибки.

ОШИБКИ

EFAULT Указан некорректный адрес памяти.
EINVAL (pthread_setaffinity_np()) В маске увязывания ЦП mask указаны процессоры, которых физически нет в системе, и которые разрешены нити согласно любым ограничениям, которые могут налагаться механизмом «cpuset», описанном в cpuset(7).
EINVAL (pthread_setaffinity_np()) В cpuset указан ЦП, который находится вне набора поддерживаемых ядром (в параметре сборки ядра CONFIG_NR_CPUS определён диапазон для набора, поддерживаемого типом данных ядра, который используется для представления наборов ЦП).
EINVAL (pthread_getaffinity_np()) Значение cpusetsize меньше размера маски увязывания, используемой в ядре.
ESRCH Нить с идентификатором thread не найдена.

ВЕРСИИ

Эти функции определены в glibc начиная с версии 2.3.4.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).
Интерфейс Атрибут Значение
pthread_setaffinity_np(), pthread_getaffinity_np() Безвредность в нитях MT-Safe

СООТВЕТСТВИЕ СТАНДАРТАМ

Данные функции являются не стандартизированными расширениями GNU, о чём свидетельствует наличие суффикса «_np» (nonportable).

ЗАМЕЧАНИЯ

После вызова pthread_setaffinity_np() набор процессоров, на которых действительно будет выполняться нить, вычисляется пересечением набора из аргумента cpuset и набором процессоров, присутствующих в системе. В дальнейшем, система может ограничить набор процессоров нити, если задействован механизм «cpuset», описанный в cpuset(7). Эти ограничения на действительный набор процессоров, используемых для нити, без уведомления налагаются ядром.
Эти функции реализованы через системные вызовы sched_setaffinity(2) и sched_getaffinity(2).
В glibc 2.3.3 версии этих функций не имеют аргумента cpusetsize. Вместо него размер набора ЦП, передаваемый используемым системным вызовам, всегда равен sizeof(cpu_set_t).
Новая нить, созданная pthread_create(3), наследует копию маски увязывания ЦП своего создателя.

ПРИМЕР

В этой программе главная нить использует pthread_setaffinity_np() для включения в свою маску увязывания ЦП процессоры с 0 по 7 (которых может не быть в системе), а затем вызывает pthread_getaffinity_np() для проверки получившейся маски увязывания ЦП у нити.
#define _GNU_SOURCE #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <errno.h>
#define handle_error_en(en, msg) \
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
int main(int argc, char *argv[]) {
int s, j;
cpu_set_t cpuset;
pthread_t thread;
thread = pthread_self();
/* включаем ЦП с 0 по 7 в маску увязывания */
CPU_ZERO(&cpuset);
for (j = 0; j < 8; j++)
CPU_SET(j, &cpuset);
s = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
if (s != 0)
handle_error_en(s, "pthread_setaffinity_np");
/* проверяем маску увязывания, назначенную нити */
s = pthread_getaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
if (s != 0)
handle_error_en(s, "pthread_getaffinity_np");
printf("Набор, возвращённый pthread_getaffinity_np(), содержит:\n");
for (j = 0; j < CPU_SETSIZE; j++)
if (CPU_ISSET(j, &cpuset))
printf(" ЦП %d\n", j);
exit(EXIT_SUCCESS); }
⇧ Top