如何创建和显示线程的属性

时间:2011-12-06 23:14:07

标签: c pthreads

该程序创建五个线程,每个线程执行TaskCode函数,该函数将此线程的唯一编号打印到标准输出。

我的问题是如何创建和显示线程的属性?

3 个答案:

答案 0 :(得分:5)

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);
   }

答案 1 :(得分:1)

您需要使用pthread_attr_*()个功能集。 This链接有一个很好的解释。

答案 2 :(得分:0)

唯一可行的方法是存储在pthread_create期间通过一个包装器传递的setattr,并查询包装器以进行审计/获取。这是基于我对linux内核2.6.34版本的经验而且它的pthread_attr_getxxxx apis不可靠。

以下是验证我的答案的简单测试

通过设置以下attrs

来创建一个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和inheritsched参数的区别。

您始终可以使用

等命令验证某些属性
ps -Leo cmd, pid, prio, policy

我在这里看到一篇关于为什么pthread_attr_getxxx因其他操作系统失败的类似帖子