SealedLips/server/DeThread.h
2023-05-07 00:17:27 +08:00

47 lines
1.5 KiB
C++

#ifndef _DETHREAD_H_
#define _DETHREAD_H_
#define NON_NULL(x) ((x)?(x):"")
#define ASSERT_MSG(COND, FMT, ARGS...)\
{\
if(!(COND)){\
char msg[1024] = {0,};\
snprintf(msg, sizeof(msg), FMT, ##ARGS);\
throw std::logic_error(msg);\
abort();\
}\
}
/**
* @brief
*
* @param HDL 线程id
* @param STACK_KB 分配的栈大小
* @param JOIN 线程是否和主线程分离
* @param FUNC 线程执行函数
* @param PARAM 传入的参数
* @param NAME 线程的名字
*
* @return int
*/
#define CREATE_THREAD(HDL,STACK_KB,JOIN,FUNC,PARAM,NAME)\
{\
char nctThdName[16] = {0,};/*max length is 16*/\
int nctThdNameLen = strlen(NON_NULL(NAME));\
if(nctThdNameLen){snprintf(nctThdName, sizeof(nctThdName), "%s", NON_NULL(NAME));}\
pthread_t nctThdId = 0;\
pthread_attr_t threadAttr;\
pthread_attr_init(&threadAttr);\
ASSERT_MSG(STACK_KB <= 1024 * 8, "Thread stack size[%d]KB is too large !!", STACK_KB);\
if(STACK_KB > 0){pthread_attr_setstacksize(&threadAttr, 1024*STACK_KB);}\
pthread_attr_setdetachstate(&threadAttr, JOIN ? PTHREAD_CREATE_JOINABLE : PTHREAD_CREATE_DETACHED);\
pthread_create(&nctThdId, &threadAttr, FUNC, (void *)PARAM);\
if((HDL))\
{\
*(pthread_t *)(HDL) = nctThdId;\
}\
ASSERT_MSG(nctThdId != 0, "Failed to create thread ! name: %s", nctThdName);\
if(nctThdNameLen){pthread_setname_np(nctThdId, nctThdName);}\
pthread_attr_destroy(&threadAttr);\
}
#endif