注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

tb-common-utils源码分析(2):简单线程管理  

2016-05-26 10:02:33|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


在上一篇文章中,我们研究了日志类的实现。比较简单,也比较实用。这次,我们来研究一个对线程的简单管理方案。

在分析源码之前,我们先来看一个使用线程类的例子,上代码:

 

  1. #include <stdio.h>  
  2. // 引用头文件  
  3. #include <tbsys.h>  
  4. using namespace tbsys;  
  5. // 写我们继承的线程类   
  6. class Myrunable : public Runnable {  
  7.     // 此处是我们的线程函数  
  8.     void run(CThread *threadvoid *arg) {  
  9.         printf("thread run/n");  
  10.     }  
  11. };  
  12. int main() {  
  13.    
  14.     // 创建我们的线程类  
  15.     Myrunable test;  
  16.       
  17.     // 创建线程管理实例  
  18.     CThread thread;  
  19.     // 启动线程  
  20.     thread.start(&test, NULL);  
  21.       
  22.     // 等待线程退出  
  23.     thread.join();  
  24.       
  25.     return 0;  
  26. }  
 

在代码中,我们先声明了一个自己的类Myrunable,该类继承于Runnable。Runnable是一个纯虚类,只提供一个run方法需要由子类来实现。

然后我们创建一个CThread的实例,该类用于管理一个线程,start方法用于启动一个线程,该方法有两个参数,一个是继承至Runnable的实例,一个是要传给我们线程的参数,这里没有参数传递,先设置为NULL,join方法用于将当前线程加入等待。

可以看到,如此我们可以很方便的进行线程的创建及管理。

下面我们来看看这是如何实现的。

先看看Runnable类,这个类比较简单,是一个纯虚类,只提供一个纯虚函数:

  1. class Runnable {  
  2. public:  
  3.     /* 
  4.      * 析构 
  5.      */  
  6.     virtual ~Runnable() {  
  7.     }     
  8.     /**  
  9.      * 运行入口函数 
  10.      */   
  11.     virtual void run(CThread *threadvoid *arg) = 0;  
  12. };         
 

再来看看CThread类的实现 ,这个类主要负责线程的管理,可查询线程的id,传给线程的参数等,先看看其他成员变量:

  1. private:  
  2.     pthread_t tid;      // pthread_self() id  
  3.     int pid;            // 线程的进程ID  
  4.     Runnable *runnable;  
  5.     void *args;  
 

再看看主要的成员函数,start函数用于启动一个线程:

[c-sharp] view plain copy
  1. void start(Runnable *r, void *a) {  
  2.         runnable = r;  
  3.         args = a;  
  4.         // 创建线程,线程函数是hook,并将自己传给该函数  
  5.         pthread_create(&tid, NULL, CThread::hook, this);  
  6.     }  
 

该函数并不是将一个真正的线程函数传给pthread_create,而是将hook函数传给它,这样,我们可以突破需要传递静态成员函数的限制。

  1. static void *hook(void *arg) {  
  2.        // 得到线程类  
  3.        CThread *thread = (CThread*) arg;  
  4.        thread->pid = gettid();  
  5.        if (thread->getRunnable()) {  
  6.            // 调用线程运行类  
  7.            thread->getRunnable()->run(threadthread->getArgs());  
  8.        }  
  9.        return (void*) NULL;  
  10.    }  
 

在hook函数中,我们可以很清楚的看到,该函数先是设置了pid,然后调用我们类中的run函数。

通过对线程的封装,我们可以将线程面向对象化了,我们可以很方便地控制与管理线程。


http://blog.csdn.net/lifeibo/article/details/5883861

  评论这张
 
阅读(146)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016