1. 线程属性:
线程属性主要包含分离状态,作用域,栈尺寸,栈地址,优先级,调度策略和参数,本节主要介绍栈尺寸和分离状态
线程属性通过pthread_attr_t进行表达,定义如下:
union pthread_attr_t { char _size_[__SIZEOF_PTHREAD_ATTR_T]; long int __align; }
2. 获取线程属性函数
3. 线程属性---分离状态(POSIX)
分离状态决定着一个线程及以何种方式终止自己,默认的属性则是非分离状态的
分离状态和非分离状态的区别:
#include <stdio.h> #include <pthread.h> #include <unistd.h> #include <string.h> void *pth_fun(void *arg) { printf("Hi, I am a pthread!\n"); return 0; } int main(void) { pthread_t pth; pthread_attr_t attr; int rs = 0; // 初始化一个线程属性参数 rs = pthread_attr_init(&attr); if (rs) { printf("init attr error!, rs = %d\n", rs); return -1; } // 设置可分离参数 rs = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if(rs) { printf("set detach error, rs = %d\n", rs); return -1; } // 创建线程 rs = pthread_create(&pth, &attr, pth_fun, NULL); if(rs) { printf("pthread create error, reason = %d\n", rs); return -1; } // 销毁参数 rs = pthread_attr_destroy(&attr); if(rs) { printf("destroy attr error, rs = %d\n", rs); } printf("main pthread will be end!\n"); // 主线程先退出 pthread_exit(NULL); printf("I will never be there!\n"); return 0; }
执行结果如下:
kunmzhao@build-245:~/study$ gcc temp.c -o temp -lpthread
kunmzhao@build-245:~/study$ ./temp
main pthread will be end!
Hi, I am a pthread!
kunmzhao@build-245:~/study$
4. 线程属性---栈空间
#define _GNU_SOURCE #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <string.h> // 默认线程栈空间大小 void *pth_fun(void *arg) { printf("Hi, I am a pthread!\n"); pthread_attr_t attr; int rs = pthread_getattr_np(pthread_self(), &attr); size_t size = 0; rs = pthread_attr_getstacksize(&attr, &size); printf("pthread size = %ld bytes\n", size); return 0; } // 设置栈空间最小值 void *pth_fun2(void *arg) { printf("Hi, I am a pthread2!\n"); pthread_attr_t attr; int rs = pthread_getattr_np(pthread_self(), &attr); size_t size = 0; rs = pthread_attr_getstacksize(&attr, &size); printf("default pthread size = %ld bytes\n", size); return 0; } int main(void) { pthread_t pth,pth2; pthread_attr_t attr; int rs = 0; int size = 0; rs = pthread_create(&pth2, NULL, pth_fun2, NULL); rs = pthread_attr_init(&attr); if (rs) { printf("init attr error!, rs = %d\n", rs); return -1; } rs = pthread_attr_setstacksize(&attr, 16384); rs = pthread_create(&pth, &attr, pth_fun, NULL); if(rs) { printf("pthread create error, reason = %d\n", rs); return -1; } sleep(2); printf("main pthread will be end!\n"); return 0; }
运行结果如下:
kunmzhao@build-245:~/study$ gcc temp.c -o temp -lpthread
kunmzhao@build-245:~/study$ ./temp
Hi, I am a pthread2!
Hi, I am a pthread!
default pthread size = 8392704 bytes
pthread size = 16384 bytes
main pthread will be end!
kunmzhao@build-245:~/study$
原文:https://www.cnblogs.com/victor1234/p/14636729.html