线程的属性

2022-10-06  本文已影响0人  二进制人类

相关API

初始化和释放

#include <pthread.h>
/*
参数1:attr指向线程属性空间,本质是一个结构体空间
    typedef struct{
        int etachstate; //线程的分离状态    
        int schedpolicy; //线程调度策略
        struct sched_param schedparam; //线程的调度参数
        int inheritsched; //线程的继承性
        int scope; //线程的作用域
        size_t guardsize; //线程栈末尾的警戒缓冲区大小
        int stackaddr_set; //线程的栈设置
        void* stackaddr; //线程栈的位置
        size_t stacksize; //线程栈的大小
    } pthread_attr_t;
返回值:成功返回 0 错误返回错误码
在使用pthread_create函数创建线程的时候,
    1) 设置线程属性参数,设置线程属性:
    2) 线程属性参数设置位NULL,采用默认线程属性(默认的属性为非绑定、非分离、缺省的堆栈、与父进程同样级别的优先级)            

 */

int pthread_attr_init(pthread_attr_t *attr);    /* 初始化线程属性空间 */  
int pthread_attr_destroy(pthread_attr_t *attr);    /* 释放线程属性空间 */

设置线程属性状态

#include <pthread.h>
/**
 * [pthread_attr_setdetachstate 设置线程属性状态]
 * @param  attr        [指向的线程属性空间]
 * @param  detachstate [
 *  PTHREAD_CREATE_DETACHED 分离线程
    PTHREADCREATE_JOINABLE  非分离线程
 * ]
 * @return             [成功返回0 错误返回错误码]
 */
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); //设置
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);//获取

设置线程栈

#include <pthread.h>
/**
 * [pthread_attr_setstack 设置线程栈]
 * @param  attr      [指向线程属性空间]
 * @param  stackaddr [传递栈空间地址]
 * @param  stacksize [空间的大小]
 * @return           [成功0 失败错误码]
 */
int pthread_attr_setstack(pthread_attr_t *attr,void *stackaddr, size_t stacksize);
int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize);

线程栈大小

#include <pthread.h>

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);

线程栈地址

#include <pthread.h>

int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);
int pthread_attr_getstackaddr(const pthread_attr_t *attr, void **stackaddr);

实例

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void *pthread_func(void *arg)
{
    while(1)
    {
        printf("child pthread\n");
        sleep(1);
    }
}

int main()
{
    int ret;
    pthread_t pthread_id;
    pthread_attr_t attr;

    /* 设置线程的属性 */
    ret = pthread_attr_init(&attr);/* 线程属性设置默认值 */
    if (ret != 0)
    {
        fprintf(stderr, "pthread_attr_init fail\n");
        return -1;
    }
#if 1
    int detachstate;
    /* 获取线程属性是否分离 */
    ret = pthread_attr_getdetachstate(&attr, &detachstate);
    if (ret != 0)
    {
        fprintf(stderr, "pthread_attr_getdetachstate fail\n");
        return -1;
    }

    if (detachstate == PTHREAD_CREATE_DETACHED)
    {
        printf("PTHREAD_CREATE_DETACHED");
    }
    else
    {
        printf("PTHREAD_CREATE_JOINABLE");
    }

#else
    /* 初始化线程属性为分离模式 */
    ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    if (ret != 0)
    {
        fprintf(stderr, "pthread_attr_setdetachstate fail\n");
        return -1;
    }
#endif

    /* 创建线程 */
    ret = pthread_create(&pthread_id, &attr, pthread_func, NULL);
    if (ret != 0)
    {
        fprintf(stderr, "create child pthread fail\n");
        return -1;
    }

    pthread_attr_destroy(&attr);

    /* 主线程阻塞等待子线程退出,才返回继续向后执行 */
    pthread_join(pthread_id, NULL);
    printf("main pthread\n");
}
上一篇 下一篇

猜你喜欢

热点阅读