C++ 封装POSIX线程

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值