pthread使用方法
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 }
编译:
gcc main.c -lpthread