【pthread库使用之封装创建线程】

基于pthread封装创建线程接口


函数实现


#define INVALID_PTHREAD_TID -1

/* 最小栈 */
#ifndef PTHREAD_STACK_MIN
    #define PTHREAD_STACK_MIN 16384
#endif

/* 最大栈 */
#ifndef PTHREAD_STACK_MAX
    #define PTHREAD_STACK_MAX (1024*1024)
#endif

/* 线程优先级 */
#define DEAFUALT_THREAD_PRI_LV    70

#define MAX_THREAD_PRI_LV    100
#define SYS_THREAD_PRI_LV    90
#define RUN_THREAD_PRI_LV    80
#define FUN_THREAD_PRI_LV    70
#define THR_THREAD_PRI_LV    60
#define MIN_THREAD_PRI_LV    50

/* 线程回调函数 */
typedef void *(*thread_func)(void *);

/**************************************************************************
    函数名称: CreateThread
    功能描述: 创建线程
    输入参数: INOUT pthread_t *pstThreadInfo                线程信息
              IN const size_t stacksize                 栈大小
              IN const int priority                     线程优先级
              IN thread_func pfFunc                     回调处理函数
              IN void *arg                              处理函数的入参
    输出参数: INOUT pthread_t *pstThreadInfo                线程信息
    注 意 点: stacksize默认使用PTHREAD_STACK_MAX
              priority默认使用DEAFUALT_THREAD_PRI_LV
***************************************************************************/
int CreateThread(INOUT pthread_t *pstThreadInfo, IN const size_t stacksize, IN const int priority, IN thread_func pfFunc, IN void *arg)
{
    pthread_t stThreadInfo = INVALID_PTHREAD_TID;
    pthread_attr_t attr;
    struct sched_param param;
    int min_pri = sched_get_priority_min(SCHED_RR);
    int max_pri = sched_get_priority_max(SCHED_RR);
    size_t _stacksize = stacksize;
    int _pri = priority;

    memset(&attr, 0, sizeof(attr));
    memset(&param, 0, sizeof(param));

    /* 矫正线程栈 */
    _stacksize = _stacksize < PTHREAD_STACK_MIN ? PTHREAD_STACK_MIN : _stacksize;

    /* 矫正优先级 */
    if (min_pri > _pri)
    {
        _pri = min_pri;
    }
    else if (max_pri < _pri)
    {
        _pri = max_pri;
    }
    else
    {
        // PASS
    }

    param.sched_priority = _pri;

    if (pthread_attr_init(&attr) < 0)
    {
        printf("init thread attr error : %s", strerror(errno));
        return ERR_COMMON_FAIL;
    }

    /* 设置线程分离 */
    if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) < 0)
    {
        printf("set attr detachstate error : %s", strerror(errno));
        pthread_attr_destroy(&attr);
        return ERR_COMMON_FAIL;
    }

    /* 设置调度策略FIFO */
    if (pthread_attr_setschedpolicy(&attr, SCHED_RR) < 0)
    {
        printf("set attr schedpolicy error : %s\n", strerror(errno));
        pthread_attr_destroy(&attr);
        return ERR_COMMON_FAIL;
    }

    /* 设置线程优先级 */
    if (pthread_attr_setschedparam(&attr, &param) < 0)
    {
        printf("set attr schedparam error : %s\n", strerror(errno));
        pthread_attr_destroy(&attr);
        return ERR_COMMON_FAIL;
    }

    /* 设置线程栈大小 */
    if (pthread_attr_setstacksize(&attr, stacksize) < 0)
    {
        printf("set attr stacksize error : %s\n", strerror(errno));
        pthread_attr_destroy(&attr);
        return ERR_COMMON_FAIL;
    }

    /* 创建线程 */
    if (pthread_create(&stThreadInfo, &attr, pfFunc, arg) < 0)
    {
        printf("pthread_create failed : %s\n", strerror(errno));
        pthread_attr_destroy(&attr);
        return ERR_COMMON_FAIL;
    }

    if (NULL != pstThreadInfo)
    {
        *pstThreadInfo = stThreadInfo;
    }

    pthread_attr_destroy(&attr);

    return ERR_COMMON_SUCCEED;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值