1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <pthread.h>
4 #include <sched.h>
5 #include <unistd.h>
6
7 void show_pthread_attr(const pthread_attr_t* attr) {
8 int detachstate, inheritsched, policy, scope;
9 size_t guardsize, stacksize;
10 void* stackaddr = NULL;
11 pthread_attr_getdetachstate(attr, &detachstate);
12 pthread_attr_getguardsize(attr, &guardsize);
13 pthread_attr_getinheritsched(attr, &inheritsched);
14 pthread_attr_getschedpolicy(attr, &policy);
15 pthread_attr_getscope(attr, &scope);
16 pthread_attr_getstack(attr, &stackaddr, &stacksize);
17 struct sched_param param_get;
18 pthread_attr_getschedparam(attr, ¶m_get);
19
20 printf("detach state: %s\n", detachstate == PTHREAD_CREATE_DETACHED ?
21 "PTHREAD_CREATE_DETACHED" : "PTHREAD_CREATE_JOINABLE"); // PTHREAD_CREATE_JOINABLE
22 printf("guard size: %ld\n", guardsize); // 4906
23 printf("inheritsched: %s\n", inheritsched == PTHREAD_INHERIT_SCHED ?
24 "PTHREAD_INHERIT_SCHED" : "PTHREAD_EXPLICIT_SCHED"); // PTHREAD_INHERIT_SCHED
25 printf("policy: %s\n", policy == SCHED_OTHER ?
26 "SCHED_OTHER" : policy == SCHED_RR ? "SCHED_RR" : "SCHED_FIFO"); // SCHED_OTHER
27 printf("scope: %s\n", scope == PTHREAD_SCOPE_PROCESS ?
28 "PTHREAD_SCOPE_PROCESS" : "PTHREAD_SCOPE_SYSTEM"); // PTHREAD_SCOPE_SYSTEM
29 printf("stack addr: %p\n", stackaddr); // (nil)
30 printf("stack size: %ld\n", stacksize); // 0
31 printf("priority: %d\n", param_get.sched_priority); // 0
32 }
33
34 void* new_thread(void* args) {
35 pthread_attr_t* attr = (pthread_attr_t*)args;
36 while(1) {
37 printf("new thread start...(%lu)\n", pthread_self());
38 sleep(2);
39 show_pthread_attr(attr);
40 }
41 }
42
43 int main(int argc, char* argv[]) {
44 pthread_t tid;
45 /* 通过对pthread_attr_t进行配置来设置线程的detach属性、调度策略、优先级、继承属性、堆栈地址、scope属性、堆栈大小 */
46 pthread_attr_t attr;
47 // show_pthread_attr(&attr);
48
49 /* 使用前初始化 */
50 pthread_attr_init(&attr);
51
52 // /**
53 // * detach属性
54 // * 如果设置为PTHREAD_CREATE_DETACHED,则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。
55 // * 这个属性也可以在线程创建并运行以后用pthread_detach()来设置,
56 // * 一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。
57 // * 默认为PTHREAD_CREATE_JOINABLE状态。
58 // */
59 // pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
60
61 // /**
62 // * 继承属性
63 // * PTHREAD_EXPLICIT_SCHED:新线程使用显式指定调度策略和调度参数(即attr中的值)。
64 // * PTHREAD_INHERIT_SCHED:继承调用者线程的值。
65 // * 默认为PTHREAD_EXPLICIT_SCHED。
66 // */
67 // pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
68
69 // /**
70 // * 调度策略
71 // * SCHED_OTHER:正常、非实时
72 // * SCHED_RR:实时、轮转
73 // * SCHED_FIFO:实时、先入先出
74 // * 默认为SCHED_OTHER,后两种调度策略仅对超级用户有效。
75 // */
76 // pthread_attr_setschedpolicy(&attr, SCHED_RR);
77
78 // /**
79 // * 优先级
80 // * 仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变
81 // * 默认为0。
82 // */
83 // struct sched_param param_set;
84 // param_set.sched_priority = 15;
85 // pthread_attr_setschedparam(&attr, ¶m_set);
86
87 // /**
88 // * Scope属性
89 // * 表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。
90 // * PTHREAD_SCOPE_SYSTEM:与系统中所有线程一起竞争CPU时间。
91 // * PTHREAD_SCOPE_PROCESS:仅与同进程中的线程竞争CPU。
92 // */
93 // pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS);
94
95 show_pthread_attr(&attr);
96
97 pthread_create(&tid, &attr, new_thread, &attr);
98 show_pthread_attr(&attr);
99 while (1) {
100 printf("main thread running...(%lu)\n", pthread_self());
101 sleep(3);
102 }
103 return 0;
104 }
编译: