pthread_setaffinity_np(3)

NUME
pthread_setaffinity_np, pthread_getaffinity_np - stabilește/obține afinitatea CPU a unui fir

BIBLIOTECA
Biblioteca de fire de execuție POSIX (libpthread, -lpthread)

SINOPSIS
#define _GNU_SOURCE             /* Consultați 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);

DESCRIERE
Funcția pthread_setaffinity_np() stabilește masca de afinitate CPU a firului thread la setul de CPU indicat de cpuset. Dacă apelul are succes, iar firul nu rulează în prezent pe unul dintre CPU-urile din cpuset, atunci acesta este migrat către unul dintre acele CPU-uri.

Funcția pthread_getaffinity_np() returnează masca de afinitate CPU a firului thread în memoria tampon indicată de cpuset.

Pentru mai multe detalii despre măștile de afinitate CPU, consultați sched_setaffinity(2). Pentru o descriere a unui set de macrocomenzi care pot fi utilizate pentru a manipula și inspecta seturile de CPU, consultați CPU_SET(3).

Argumentul cpusetsize este lungimea (în octeți) a memoriei tampon indicate de cpuset. De obicei, acest argument ar fi specificat ca sizeof(cpu_set_t); (poate fi o altă valoare, dacă se utilizează macrocomenzile descrise în CPU_SET(3) pentru alocarea dinamică a unui set CPU).

VALOAREA RETURNATĂ
În caz de succes, aceste funcții returnează 0; în caz de eroare, ele returnează un număr de eroare diferit de zero.

ERORI-IEȘIRE

EFAULT
    Adresa de memorie furnizată nu a fost validă.

EINVAL
    (pthread_setaffinity_np()) Masca de biți de afinitate mask nu conține niciun procesor care se află în prezent fizic pe sistem și care este permis firului de execuție în conformitate cu orice restricții care pot fi impuse de mecanismul „cpuset” descris în cpuset(7).

EINVAL
    (pthread_setaffinity_np()) cpuset a specificat un CPU care se afla în afara setului acceptat de nucleu; (opțiunea de configurare a nucleului CONFIG_NR_CPUS definește intervalul setului acceptat de tipul de date al nucleului utilizat pentru a reprezenta seturile de CPU).

EINVAL
    (pthread_getaffinity_np()) cpusetsize este mai mică decât dimensiunea măștii de afinitate utilizată de nucleu.

ESRCH
    Nu a putut fi găsit niciun fir de execuție cu identificatorul thread.

ATRIBUTE
Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).
Interfață | Atribut | Valoare
pthread_setaffinity_np(), pthread_getaffinity_np() | Siguranța firelor | MT-Safe

STANDARDE
GNU; de aici și sufixul „_np” (neportabil) din denumiri.

ISTORIC
glibc 2.3.4.

Numai în glibc 2.3.3, au fost furnizate versiuni ale acestor funcții care nu aveau un argument cpusetsize. În schimb, dimensiunea setului de procesoare transmisă apelurilor de sistem subiacente era întotdeauna sizeof(cpu_set_t).

NOTE
După un apel la pthread_setaffinity_np(), setul de CPU-uri pe care se va executa efectiv firul este intersecția dintre setul specificat în argumentul cpuset și setul de CPU-uri prezente efectiv în sistem. Sistemul poate restricționa și mai mult setul de CPU-uri pe care rulează firul de execuție dacă se utilizează mecanismul „cpuset” descris în cpuset(7). Aceste restricții privind setul real de CPU-uri pe care va rula firul sunt impuse în mod silențios de către nucleu.

Aceste funcții sunt implementate pe baza apelurilor de sistem sched_setaffinity(2) și sched_getaffinity(2).

Un nou fir creat de pthread_create(3) moștenește o copie a măștii de afinitate CPU a creatorului său.

EXEMPLE
În următorul program, firul principal utilizează pthread_setaffinity_np() pentru a-și defini masca de afinitate CPU pentru a include CPU de la 0 la 7 (care pot să nu fie toate disponibile în sistem) și apoi apelează pthread_getaffinity_np() pentru a verifica masca de afinitate CPU rezultată a firului.

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

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

        thread = pthread_self();

        /* Definește masca de afinitate pentru a include CPU de la 0 la 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");

        /* Verifică masca de afinitate actuală atribuită firului. */

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

        printf("Setul returnat de pthread_getaffinity_np() conține:\n");
        for (size_t j = 0; j < CPU_SETSIZE; j++)
            if (CPU_ISSET(j, &cpuset))
                printf("    CPU %zu\n", j);

        exit(EXIT_SUCCESS);
    }

CONSULTAȚI ȘI
sched_setaffinity(2), CPU_SET(3), pthread_attr_setaffinity_np(3), pthread_self(3), sched_getcpu(3), cpuset(7), pthreads(7), sched(7)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.