Provided by: manpages-ru-dev_4.27.0-1_all bug

НАИМЕНОВАНИЕ

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

БИБЛИОТЕКА

       Библиотека потоков POSIX (libpthread, -lpthread)

ОБЗОР

       #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_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 не найдена.

АТРИБУТЫ

       Описание терминов данного раздела смотрите в attributes(7).
       ┌─────────────────────────────────────────────────────────────────────┬──────────────────────┬──────────┐
       │ ИнтерфейсАтрибутЗначение │
       ├─────────────────────────────────────────────────────────────────────┼──────────────────────┼──────────┤
       │ pthread_setaffinity_np(), pthread_getaffinity_np()                  │ Безвредность в нитях │ MT-Safe  │
       └─────────────────────────────────────────────────────────────────────┴──────────────────────┴──────────┘

СТАНДАРТЫ

       GNU, о чём свидетельствует наличие суффикса «_np» (nonportable) в именах.

ИСТОРИЯ

       glibc 2.3.4.

       В  glibc  2.3.3  версии  этих  функций  не  имеют  аргумента  cpusetsize.  Вместо  него размер набора ЦП,
       передаваемый используемым системным вызовам, всегда равен sizeof(cpu_set_t).

ПРИМЕЧАНИЯ

       После вызова pthread_setaffinity_np() набор процессоров, на которых действительно будет выполняться нить,
       вычисляется пересечением набора из аргумента cpuset и набором процессоров, присутствующих  в  системе.  В
       дальнейшем,  система  может  ограничить  набор  процессоров  нити,  если  задействован механизм «cpuset»,
       описанный в cpuset(7). Эти ограничения на действительный набор процессоров, используемых  для  нити,  без
       уведомления налагаются ядром.

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

       Новая нить, созданная pthread_create(3), наследует копию маски увязывания ЦП своего создателя.

ПРИМЕРЫ

       В  этой  программе главная нить использует pthread_setaffinity_np() для включения в свою маску увязывания
       ЦП  процессоры с 0 по 7 (которых может не быть в системе), а затем вызывает pthread_getaffinity_np()  для
       проверки получившейся маски увязывания ЦП у нити.

       #define _GNU_SOURCE
       #include <err.h>
       #include <errno.h>
       #include <pthread.h>
       #include <stdio.h>
       #include <stdlib.h>

       int
       main(void)
       {
           int s;
           cpu_set_t cpuset;
           pthread_t thread;

           thread = pthread_self();

           /* Set affinity mask to include CPUs 0 to 7. */

           CPU_ZERO(&cpuset);
           for (size_t j = 0; j < 8; j++)
               CPU_SET(j, &cpuset);

           s = pthread_setaffinity_np(thread, sizeof(cpuset), &cpuset);
           if (s != 0)
               errc(EXIT_FAILURE, s, "pthread_setaffinity_np");

           /* Check the actual affinity mask assigned to the thread. */

           s = pthread_getaffinity_np(thread, sizeof(cpuset), &cpuset);
           if (s != 0)
               errc(EXIT_FAILURE, s, "pthread_getaffinity_np");

           printf("Set returned by pthread_getaffinity_np() contained:\n");
           for (size_t j = 0; j < CPU_SETSIZE; j++)
               if (CPU_ISSET(j, &cpuset))
                   printf("    CPU %zu\n", j);

           exit(EXIT_SUCCESS);
       }

СМОТРИТЕ ТАКЖЕ

       sched_setaffinity(2),   CPU_SET(3),   pthread_attr_setaffinity_np(3),  pthread_self(3),  sched_getcpu(3),
       cpuset(7), pthreads(7), sched(7)

ПЕРЕВОД

       Русский    перевод    этой    страницы    руководства    разработал(и)    Alexey,     Azamat     Hackimov
       <azamat.hackimov@gmail.com>,       kogamatranslator49       <r.podarov@yandex.ru>,      Darima      Kogan
       <silverdk99@gmail.com>, Max  Is  <ismax799@gmail.com>,  Yuri  Kozlov  <yuray@komyakino.ru>,  Иван  Павлов
       <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот  перевод является свободной программной документацией; он распространяется на условиях общедоступной
       лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html  версии  3  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если  вы  обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
       разработчику(ам)  по  его(их)  адресу(ам)  электронной  почты  или  по   адресу   списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                  15 июня 2024 г.                       pthread_setaffinity_np(3)