linux线程2
来源:互联网 发布:惠州乐知英语 编辑:程序博客网 时间:2024/06/01 09:51
线程的属性
- 线程的创建借口pthread_create第二个入参attr指定新建线程的相关属性,一个线程的属性主要包括:线程栈地址和大小,线程的调度策略和优先级,线程是否属于分离detach状态等.
- 属性的初始化和销毁,初始化必须在线程创建接口前
#include <pthread.h>int pthread_attr_init(pthread_attr_t *attr); int pthread_attr_destroy(pthread_attr_t *attr);
- 获取指定线程的属性:
//pthread_getattr_np属于GNU扩展接口,非posix标准,//#include<pthread.h>前需定义宏_GNU_SOURCE#define _GNU_SOURCE#include <pthread.h>int pthread_getattr_np(pthread_t thread, pthread_attr_t *attr);
- 设置和获取线程的状态
- detachstate参数的取值:
– PTHREAD_CREATE_JOINABLE,新建线程处于可连接状态,该值为不指定属性创建线程时的默认值。
– PTHREAD_CREATE_DETACHED,新建线程处于分离状态
#include <pthread.h>int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
- 设置或获取线程栈地址及大小:
#include <pthread.h>int pthread_attr_setstack(pthread_attr_t *attr,void *stackaddr, size_t stacksize);int pthread_attr_getstack(pthread_attr_t *attr, void **stackaddr, size_t *stacksize);
线程attr设置的一个demo代码
//// Created by wuxiao on 17-5-29.//#ifndef _GNU_SOURCE#define _GNU_SOURCE#endif#include <stdio.h>#include <pthread.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#define handle_error_en(en,msg)\ errno = en;perror(msg);exit(EXIT_FAILURE);#define DEFAULT_STACK_SIZE 16384static void display_pthread_attr(pthread_attr_t *attr,const char* prefix){ int result,state; size_t stacksize; void* stackaddr; struct sched_param sp; //获取线程的分离状态 result = pthread_attr_getdetachstate(attr,&state); if(result != 0) { handle_error_en(result,"pthread_attr_getdetachstate"); } if(state == PTHREAD_CREATE_DETACHED) { printf("%s Detach state = PTHREAD_CREATE_DETACHED\n",prefix); } else { printf("%s Detach state = PTHREAD_CREATE_JOINABLE\n",prefix); } //获取线程栈地址和栈大小 result = pthread_attr_getstack(attr,&stackaddr,&stacksize); if(result != 0) { handle_error_en(result,"pthread_attr_getstack"); } printf("%s stack addr = %p\n",prefix,stackaddr); printf("%s stack size = 0x%x\n",prefix,(unsigned)stacksize);}static void* thread_start(void *arg){ int result; pthread_attr_t gattr; result = pthread_getattr_np(pthread_self(),&gattr); if(result != 0) { handle_error_en(result,"pthread_getattr_np"); } printf("thread attributes:\n"); display_pthread_attr(&gattr,"\t"); exit(EXIT_SUCCESS);}int main(int argc,char* argv[]){ pthread_t thr; pthread_attr_t attr; pthread_attr_t *attrp; int result; attrp = NULL; //命令行参数设置线程的栈大小和地址,状态为分离状态 size_t stack_size = DEFAULT_STACK_SIZE; void *sp; attrp = &attr; result = pthread_attr_init(&attr); if(result != 0) { handle_error_en(result,"pthread_attr_init"); } //设置线程状态 result = pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); if(result != 0) { handle_error_en(result,"pthread_attr_setdetachstate"); } //获取分配线程栈地址和大小 if(argc > 1) { stack_size = strtoul(argv[1], NULL, 0); } result = posix_memalign(&sp,sysconf(_SC_PAGESIZE),stack_size); if(result != 0) { handle_error_en(result,"posix_memalign"); } printf("posix_memalign() allocated at %p,stacksize = %zu\n",sp,stack_size); //更新attr状态的栈大小和地址值 result = pthread_attr_setstack(&attr,sp,stack_size); if(result != 0) { handle_error_en(result,"pthread_attr_setstack"); } //创建线程 result = pthread_create(&thr,attrp,&thread_start,NULL); if(result != 0) { handle_error_en(result,"pthread_attr_setstack"); } printf("pthread_create ok,posix_memalign() allocated at %p,stacksize = %zu\n",sp,stack_size); //销毁状态 if(attrp) { result = pthread_attr_destroy(attrp); if(result != 0) { handle_error_en(result,"pthread_attr_destroy"); } } return 0;}
阅读全文
0 0
- linux线程2
- Linux线程(2): 线程的终止
- linux线程系列(2)linux线程分类
- Linux/UNIX线程(2)
- linux内核线程 [实现2]
- linux线程学习(2)
- Linux C线程总结(2)
- linux 线程 线程属性
- linux 线程 线程同步
- linux 线程
- linux线程
- Linux 线程
- linux 线程
- linux线程
- Linux “线程”
- Linux线程
- linux 线程
- linux 线程
- 【JavaSE系列-基础篇7】——运算符
- 图解性能优化pdf
- Elasticsearch基础教程
- 搜索 P
- 一道关于扔球的DP问题
- linux线程2
- java中正则表达式以及Pattern和Matcher
- 神经网络笔记
- 利用Apache Bench进行网站服务器压力测试实例
- 1006. 换个格式输出整数 (15)
- 会计科目的共同类指的是什么
- android getevent用法
- java定时器时间配置
- angular2实战笔记--组件开发