pthread_setaffinity_np(3) | Library Functions Manual | pthread_setaffinity_np(3) |
ИМЯ
pthread_setaffinity_np, pthread_getaffinity_np - получить/назначить увязываемый ЦП для нити
LIBRARY
POSIX threads library (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; hence the suffix "_np" (nonportable) in the names.
ИСТОРИЯ
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>
Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику по его адресу электронной почты или по адресу списка рассылки русских переводчиков.
2 мая 2024 г. | Linux man-pages 6.8 |