原文链接:http://my.oschina.net/osbin/blog/215125
一、全局函数作为线程的入口函数 二、静态成员函数作为线程的入口函数 三、友元函数作为线程的入口函数 四、无参成员函数作为线程的入口函数
假设线程入口函数和创建线程函数原型如下:
线程入口函数原型:
typedef void* (*FNTHREAD)(void *pParam);
其中:pParam传递给线程的参数。
创建线程函数原型:
THREAD ThreadCreate(void *pParam, FNTHREAD fnThreadProc) ;
其中:pParam传递给线程的参数。fnThreadProc线程入口函数。THREAD函数返回类型,线程句柄。
不考虑等待线程结束、释放线程句柄...等问题。
一、全局函数作为线程的入口函数
01 |
void* FunThreadGlobal(void *pParam) ; |
08 |
return ThreadCreate(this, FunThreadGlobal) ; |
13 |
cout<<"CThreadGlobal"<<endl ; |
18 |
void* FunThreadGlobal(void *pParam) |
20 |
CThreadGlobal *p = static_cast<CThreadGlobal *>(pParam) ; |
21 |
return (p != NULL) ? p->ThreadProc() : NULL ; |
二、静态成员函数作为线程的入口函数
06 |
return ThreadCreate(this, FunThreadStatic) ; |
11 |
cout<<"CThreadStatic"<<endl ; |
15 |
static void* FunThreadStatic(void *pParam) ; |
18 |
void* CThreadStatic::FunThreadStatic(void *pParam) |
20 |
CThreadStatic *p = static_cast<CThreadStatic *>(pParam) ; |
21 |
return (p != NULL) ? p->ThreadProc() : NULL ; |
三、友元函数作为线程的入口函数
04 |
friend void* FunThreadFriend(void *pParam) ; |
08 |
return ThreadCreate(this, FunThreadFriend) ; |
13 |
cout<<"CThreadFriend"<<endl ; |
18 |
static void* FunThreadFriend(void *pParam) |
20 |
CThreadFriend *p = static_cast<CThreadFriend *>(pParam) ; |
21 |
return (p != NULL) ? p->ThreadProc() : NULL ; |
四、无参成员函数作为线程的入口函数
类成员函数有个隐含的this指针,对于类成员函数ReturnType Class::MemFun(ParameterList...) ;
可以看成是ReturnType MemFun(Class * this, ParameterList...) ;
因此无参的成员函数刚好可以当线程的入口函数。但C++不支持将成员函数指针强制转换成其它类型的指针,
成员函数ReturnType Class::MemFun();直接强制类型转换 FNTHREAD fun = (FNTHREAD)&Class::MemFun; 这样写法将引起编译错误。
这种方式不行,那么就换别的。条条大道通罗马,能达到目的就行。下面介绍两种实现方式:
4.1、函数模板方式
01 |
template<typename T, typename F> |
02 |
THREAD ThreadCreateTemplate(T *t, F f) |
04 |
typedef void* (T::*THISCALLFUN)(); |
05 |
THISCALLFUN fnTcf = (THISCALLFUN)f; |
06 |
FNTHREAD fnFun = *(FNTHREAD*)&fnTcf ; |
07 |
return ThreadCreate(t, fnFun) ; |
15 |
return ThreadCreateTemplate(this, &CThreadTemplate::ThreadProc) ; |
20 |
cout<<"CThreadTemplate"<<endl ; |
4.2、变参函数方式
虽然不能将成员函数指针强制转换成其它类型的指针,但尝试发现可以把成员函数指针传给可变参数的函数。
01 |
THREAD ThreadCreateVarParam(void *pParam, ...) |
03 |
FNTHREAD fnFun = NULL; |
05 |
va_start (pArgList, pParam) ; |
06 |
fnFun = *(FNTHREAD *)pArgList ; |
08 |
return fnFun != NULL ? ThreadCreate(pParam, fnFun) : (THREAD)0 ; |
16 |
return ThreadCreateVarParam(this, &CThreadVarParam::ThreadProc) ; |
21 |
cout<<"CThreadVarParam"<<endl ; |