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);
}

***************************************************************************************************

 

posted @ 2020-08-14 21:47  houlianpi  阅读(191)  评论(0)    收藏  举报