Как создать и отобразить атрибуты потока - PullRequest
3 голосов
/ 07 декабря 2011

Эта программа создает пять потоков, каждый из которых выполняет функцию TaskCode, которая выводит уникальный номер этого потока на стандартный вывод.

Мой вопрос: как я могу создавать и отображать атрибуты потоков?

Ответы [ 3 ]

6 голосов
/ 07 декабря 2011

Страница man pthread_attr_init(3) содержит пример программы, показывающей, как получить атрибуты, доступные для потоков.Обратите внимание, что API не позволяют указывать идентификатор потока pthread_t и поэтому могут возвращать только атрибуты текущего потока:

   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);
   }
2 голосов
/ 07 декабря 2011

Вам необходимо использовать набор функций pthread_attr_*(). Эта ссылка имеет хорошее объяснение.

1 голос
/ 06 августа 2013

Единственный надежный способ сделать это - сохранить setattr, которые были переданы во время pthread_create через одну единственную оболочку, и запросить оболочку для целей аудита / получения. Это основано на моем опыте работы с ядром Linux версии 2.6.34, и его pthread_attr_getxxxx apis не надежны.

Ниже приведен простой тест для проверки моего ответа

Создайте pthread, установив следующие атрибуты

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;

и внутри функции потока запросите атрибуты, используя pthread_attr_getxxxx, и, скорее всего, вы увидите разные значения. Я точно вижу разницу в schedpolicy и унаследованных параметрах.

Вы всегда можете проверить некоторые атрибуты, используя команду, такую ​​как

ps -Leo cmd, pid, prio, policy

Я вижу похожий пост о том, почему pthread_attr_getxxx не работает для других ОС, здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...