该程序创建五个线程,每个线程执行TaskCode函数,该函数将此线程的唯一编号打印到标准输出。
我的问题是如何创建和显示线程的属性?
答案 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
来创建一个pthreadpthread_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因其他操作系统失败的类似帖子