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, &param_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, &param_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

 

posted @ 2021-02-09 15:19  代萌  阅读(591)  评论(1编辑  收藏  举报