我们通常有这样的需求:需要在C++中用多线程处理可以并行处理的问题,且把线程函数封装在类中,而把线程函数封装在类中,导致了this指针作为默认的参数被传进了函数中,从而和线程函数参数不能匹配,不能通过编译。
一般有以下几种解决方案:
1. 将线程函数作为全局函数, 从而避免了this指针作为隐含参数的作怪行为,但这样线程函数却无法访问类中的私有变量,此为一大缺憾。
解决方案: 是把所有的私有变量变为全局变量,这样极大程度上破坏了类的封装性。
2. 引入友元函数,从而可以访问私有变量,但确需要创建一个该类的对象。
3. 将线程函数作为静态函数,因为在C++中静态函数没有this指针(即在内存中静态函数和普通全局函数几乎没有什么区别),故可以匹配编译通过, 但是当线程函数要访问私有变量呢?可以访问到吗?答案是不可以!
解决方案: 将this指针作为参数传递给静态函数,这样可以通过该this指针访问所有的私有变量。
下面是代码例子。
class Thread
{
public:
Thread():m_tid(0)
{
pthead_create(&m_tid,NULL, ThreadRun, this);
pthread_detach(m_tid);
}
static void* ThreadRun(void* parm)
{
Thread *pt = (Thread*)parm;
pt->run();
}
}
virtual void run()=0;
private:
pthread_t m_tid;
};
但是我要是还需要向静态函数中传递我自己需要的参数呢?
答案是:将this指针和需要的参数作为一个结构体一起传给静态函数。
struct Args { Thread *pthis; int var;};