C++ 封装POSIX线程

来源:互联网 发布:手机练字软件 编辑:程序博客网 时间:2024/06/06 19:28

       我们通常有这样的需求:需要在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;};