打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
深入Pthread(五):线程属性

深入Pthread(五):线程属性

974人阅读 评论(0) 收藏 举报

深入Pthread(五):线程属性

 

线程属性相关API


phtread_attr_t attr;
int pthread_attr_init(pthread_attr_t* attr);
int pthread_attr_destroy(pthread_attr_t* attr);
int pthread_attr_getdetachstate(pthread_attr_t* attr, int* detachstate);
int pthread_attr_setdetachstate(pthread_attr_t* attr, int detachstate);
 
#ifdef _POSIX_THREAD_ATTR_STACKSIZE
int pthread_attr_getstacksize(pthread_attr_t* attr, size_t* stacksize);
int pthread_attr_setstacksize(pthread_attr_t* attr, size_t stacksize);
#endif
 
#ifdef _POSIX_THREAD_ATTR_STACKADDR
int pthread_attr_getstackaddr(pthread_attr_t* attr, void* stackaddr);
int pthread_attr_setstackaddr(pthread_attr_t* attr, void** stackaddr); 
#endif
 

线程属性


POSIX定义的线程属性有:可分离状态(detachstate), 线程栈大小(stacksize),线程栈地址( stackaddr),作用域(scope), 继承调度(inheritsched), 调度策略(schedpolicy)和调度参数( schedparam)。 有些系统并不支持所有这些属性,使用前注意查看系统文档。
 
    但是所有Pthread系统都支持detachstate属性,该属性可以是PTHREAD_CREATE_JOINABLE或PTHREAD_CREATE_DETACHED,默认的是joinable的。拥有joinable属性的线程可以被另外一个线程等待,同时还可以获得线程的返回值,然后被回收。而detached的线程结束时,使用的资源立马就会释放,不用其他线程等待。
 
    线程stacksize属性移植性不是很好,若你的系统定义了_POSIX_THREAD_ATTR_STACKSIZE ,才可以调用api设定线程堆栈大小。Pthreads规定线程堆栈大小必须大于等于PTHREAD_STACK_MIN。
 
    线程stackaddr属性移植性相当不好,若系统定义了_POSIX_THREAD_ATTR_STACKADDR,才可以调用api设定线程堆栈地址,指定一块内存区域,这块内存区域大小至少是PTHREAD_STACK_MIN。机器堆栈向上增长的,必须指定为低地址;机器堆栈向下增长的,必须指定为高地址。这个属性,最好不要用。
 
 

例程:

 

  1. #include <pthread.h>  
  2. #include "error.h"  
  3. #include <limits.h>  
  4.   
  5. pthread_attr_t attr;  
  6.   
  7.   
  8. void* thread_routine(void* arg)  
  9. {  
  10.     sleep(1);  
  11. #ifdef _POSIX_THREAD_ATTR_STACKSIZE  
  12.     size_t stacksize;  
  13.     int status = pthread_attr_getstacksize(&attr, &stacksize);  
  14.     printf("[stacksize:%lu]thread routine is running..../n",stacksize);  
  15. #endif  
  16.   
  17.     return NULL;  
  18. }  
  19.   
  20. int main()  
  21. {  
  22.     pthread_t pid;  
  23.     int status;  
  24.     size_t stacksize;  
  25.     status = pthread_attr_init(&attr);  
  26.     if(status != 0)  
  27.         ERROR_ABORT(status,"Init attr");  
  28.   
  29.     status = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);  
  30.     if(status != 0)  
  31.         ERROR_ABORT(status, "Set detachstate");  
  32.   
  33. #ifdef _POSIX_THREAD_ATTR_STACKSIZE  
  34.     status = pthread_attr_getstacksize(&attr, &stacksize);  
  35.     if(status != 0)  
  36.         ERROR_ABORT(status, "Get stacksize");  
  37.     printf("Original thread size:%lu/n", stacksize);  
  38.   
  39.     status = pthread_attr_setstacksize(&attr, 2*PTHREAD_STACK_MIN);  
  40.     if(status != 0)  
  41.         ERROR_ABORT(status, "Set stacksize");  
  42. #endif  
  43.   
  44.     status = pthread_create(&pid, &attr, thread_routine, NULL);  
  45.     if(status !=0 )  
  46.         ERROR_ABORT(status, "Create thread");  
  47.   
  48.     status = pthread_attr_destroy(&attr);  
  49.     if(status != 0)  
  50.         ERROR_ABORT(status, "Destroy attr");  
  51.   
  52.     printf("Main thread is over.../n");  
  53.     pthread_exit(NULL);  
  54. }  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
pthread之线程堆栈
pthread 简要使用指南(五) 线程属性(pthread
C++:多线程类库的设计与实现(六)
线程的基本概念和调度策略
Linux多线程pthread
Posix线程编程API简介
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服