linux线程编程--线程属性
linux下线程的属性是可以根据实际项目需要,进行设置的。一般情况下,默认的属性设置就可以解决大多数开发中遇到的问题。
对于属性设置有如下结构体:
typedef struct
{
int etachstate; //线程的分离状态
int schedpolicy; //线程的调度策略
struct sched_param schedparam; //线程的调度参数
int inheritsched; //线程的继承性
int scope; //线程的作用域
size_t giardsize; //线程栈末尾的警戒缓冲区大小
int stackaddr_set ; //线程的栈设置
void *stackaddr; //线程栈的位置
size_t stacksize; //线程栈的大小
}pthread_attr_t;
线程数形初始化:
线程属性必须先初始化,之后才能调用pthread_create()创建线程。
初始化线程属性:
int pthread_attr_init(pthread_attr_t *attr); 成功返回 0;失败返回错误号。
销毁线程属性所占用的资源
int pthread_attr_destroy(pthread_attr_t *attr); 成功返回0 ;失败返回错误号
线程的分离态:
现成的分离态决定了一个线程以什么样的方式来终止自己。
非分离状态:线程的默认属性是非分离状态,渣中状态下,原有的线程等待创建的此案城结束,只有当pthread_join()函数
返回时,创建的线程才算终止,才能释放自己占用的系统资源。
分离状态: 分离线程没有被其他的线程所等待,自己运行结束了,线程也就结束啦。马上释放系统资源。
设置线程属性,分离 or 非分离
int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate);
获取线程属性 分离 or 非分离
int pthread_attr_getdetachstate(pthread_attr_t *attr,int *detachstate);
参数: attr:已经初始化的线程属性
detacjstate: PTHREAD_CREATE_DETACHED(分离线程)
PTHREAD_CREATE_JOINABLE
************************************************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <pthread.h>
typedef struct
{
int a;
int b;
}exit_t;
void *thread_func(void *arg)
{
exit_t *ret;
ret = (exit_t*)malloc(sizeof(exit_t));
ret->a = 100;
ret->b = 99;
pthread_exit((void*)ret);
}
int main(int argc,char *argv[])
{
exit_t *retval;
pthread_t tid;
pthread_attr_t attr;
int sta;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_ATTR_DETACHED); //设置为分离属性
int ret = pthread_create(&tid,&attr,&thread_func,NULL);
if(ret)
{
printf("Thread create failed.\n");
exit(1);
}
// pthread_detach(tid);
pthread_attr_getdetachstate(&attr,&sta);
if(sta == PTHREAD_CREATE_DETACHED)
{
printf("thread state is detach");
}
int retk = pthread_join(tid,(void**)&retval);
if(retk)
printf("Can't get thread return state.errno = %d\n",ret);
// printf("a = %d,b = %d \n",retval->a,retval->b);
pthread_exit(NULL);
}
***************************************************************************************************

浙公网安备 33010602011771号