基于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(¶m, 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, ¶m) < 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;
}