Hoe de eigenschappen van threads te maken en weer te geven

Dit programma maakt vijf threads, elk met de functie TaskCode die het unieke nummer van deze thread naar standaarduitvoer afdrukt.

Mijn vraag is hoe kan ik de kenmerken van de threads maken en weergeven?

1
@DavidSchwartz Ik heb mijn vraag bijgewerkt
toegevoegd de auteur EnexoOnoma, de bron
@DavidSchwartz Ja meneer
toegevoegd de auteur EnexoOnoma, de bron
Over welke 'attributen' heb je het?
toegevoegd de auteur David Schwartz, de bron
Ik weet nog steeds niet over welke attributen je het hebt. Bedoel je POSIX pthread-creatieattributen zoals stack-size?
toegevoegd de auteur David Schwartz, de bron

3 antwoord

De pthread_attr_init (3) manpage bevat een voorbeeldprogramma dat laat zien hoe de attributen beschikbaar voor threads terug te halen zijn. Merk op dat de API's het niet toestaan ​​om de pthread_t thread-ID op te geven en dus alleen de attributen van de huidige thread kunnen retourneren:

   static void
   display_pthread_attr(pthread_attr_t *attr, char *prefix)
   {
       int s, i;
       size_t v;
       void *stkaddr;
       struct sched_param sp;

       s = pthread_attr_getdetachstate(attr, &i);
       if (s != 0)
           handle_error_en(s, "pthread_attr_getdetachstate");
       printf("%sDetach state        = %s\n", prefix,
               (i == PTHREAD_CREATE_DETACHED) ? "PTHREAD_CREATE_DETACHED" :
               (i == PTHREAD_CREATE_JOINABLE) ? "PTHREAD_CREATE_JOINABLE" :
               "???");

       s = pthread_attr_getscope(attr, &i);
       if (s != 0)
           handle_error_en(s, "pthread_attr_getscope");
       printf("%sScope               = %s\n", prefix,
               (i == PTHREAD_SCOPE_SYSTEM)  ? "PTHREAD_SCOPE_SYSTEM" :
               (i == PTHREAD_SCOPE_PROCESS) ? "PTHREAD_SCOPE_PROCESS" :
               "???");

       s = pthread_attr_getinheritsched(attr, &i);
       if (s != 0)
           handle_error_en(s, "pthread_attr_getinheritsched");
       printf("%sInherit scheduler   = %s\n", prefix,
               (i == PTHREAD_INHERIT_SCHED)  ? "PTHREAD_INHERIT_SCHED" :
               (i == PTHREAD_EXPLICIT_SCHED) ? "PTHREAD_EXPLICIT_SCHED" :
               "???");

       s = pthread_attr_getschedpolicy(attr, &i);
       if (s != 0)
           handle_error_en(s, "pthread_attr_getschedpolicy");
       printf("%sScheduling policy   = %s\n", prefix,
               (i == SCHED_OTHER) ? "SCHED_OTHER" :
               (i == SCHED_FIFO)  ? "SCHED_FIFO" :
               (i == SCHED_RR)    ? "SCHED_RR" :
               "???");

       s = pthread_attr_getschedparam(attr, &sp);
       if (s != 0)
           handle_error_en(s, "pthread_attr_getschedparam");
       printf("%sScheduling priority = %d\n", prefix, sp.sched_priority);

       s = pthread_attr_getguardsize(attr, &v);
       if (s != 0)
           handle_error_en(s, "pthread_attr_getguardsize");
       printf("%sGuard size          = %d bytes\n", prefix, v);

       s = pthread_attr_getstack(attr, &stkaddr, &v);
       if (s != 0)
           handle_error_en(s, "pthread_attr_getstack");
       printf("%sStack address       = %p\n", prefix, stkaddr);
       printf("%sStack size          = 0x%x bytes\n", prefix, v);
   }
4
toegevoegd

U moet de reeks functies van pthread_attr _ *() gebruiken. Deze link heeft een leuke uitleg.

1
toegevoegd

De enige betrouwbare manier om dit te doen is om de setattr op te slaan die werden doorgegeven tijdens pthread_create via een enkele wrapper en de wrapper te ondervragen voor audit/get purpose. Dit is gebaseerd op mijn ervaring met de Linux-kernel 2.6.34-versie en het is pthread_attr_getxxxx apis zijn niet betrouwbaar.

Hieronder is een eenvoudige test om mijn antwoord te valideren

Maak een pthread door de volgende attrs te wijzigen

pthread_attr_setscope = PTHREAD_SCOPE_SYSTEM
pthread_attr_setinheritsched = PTHREAD_EXPLICIT_SCHED
pthread_attr_setschedpolicy = SCHED_FIFO
pthread_attr_setguardsize = 1k;
pthread_attr_setstacksize = 32K;

en binnen de threadfunctiequery de attributen die pthread_attr_getxxxx gebruiken en hoogstwaarschijnlijk zult u verschillende waarden zien. Ik zie zeker verschil in schema's en inheritsch parameters.

Je kunt altijd een aantal attributen verifiëren met behulp van commando like

ps -Leo cmd, pid, prio, policy

Ik zie een vergelijkbaar bericht over waarom pthread_attr_getxxx hier voor andere besturingssystemen niet werkt

0
toegevoegd