利用类的继承对pthread封装

本文深入探讨了在C++中使用pthread库进行多线程编程的方法,对比了两种封装思路,介绍了如何通过继承和虚拟函数简化多线程操作,并讨论了堆上创建线程的释放问题及解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多线程在网络编程中作用重大,由于创建/销毁线程、线程间通信的开销小,目前很多网络服务器都是用多线程(线程池)的模式对外提供服务。linux上开发多线程程序多使用pthread库,本文主要讨论使用C++封装pthread库时可能出现的问题。

 

封装pthread库主要有两种思路,第一种是简单的封装接口,如下所示:

 

  1. class simple_thread_t {
  2. public:
  3.     int start(void (*task)(void *), void *argp)
  4.     {
  5.         // do something else
  6.         pthread_create(&_tid, NULL, task, argp);
  7.     }
  8.     int join()
  9.     {
  10.         // do something else
  11.         pthread_join(_tid, NULL);
  12.     }
  13.     int detach()
  14.     {
  15.         pthread_detach(_tid);
  16.     }
  17.     // some other interfaces
  18. private:
  19.     pthread_t _tid;
  20. };


simple_thread_t只是简单的封装了pthread库的接口,但需要创建线程时,跟使用pthread库一样,需要先实现好线程例程函数,然后传递给start,线程执行时需要依赖的数据可以通过参数传递。

 

第二种封装方式则是在内部做了参数传递的工作,充分利用C++继承的特性,如下代码。

  1. class common_thread_t {
  2. public:
  3.     int start()
  4.     {
  5.          // do something else
  6.         pthread_create(&_tid, NULL, _process, (void *)this);
  7.     }
  8.     int join()
  9.     {
  10.         // do something else
  11.         pthread_join(_tid, NULL);
  12.     }
  13.     int detach()
  14.     {
  15.         pthread_detach(_tid);
  16.     }
  17.     // some other interfaces
  18.     virtual void run() = 0;
  19. private:
  20.     pthread_t _tid;
  21.     static void *_process(void *argp)
  22.     {
  23.         common_thread_t *thread = (common_thread_t*)argp;
  24.         thread->run();
  25.     }
  26. };

 

用户要创建线程,只需继承common_thread_t,并实现run接口即可,用户可以在子类中定义额外的数据以供run接口使用,在实现子类后,创建子类实例并调用start即可创建线程。

 

在使用common_thread_t时,有个限制,在线程没有正式运行之前,common_thread_t的对象不能销毁,否则会出现pure virtual function called的错误, 因为在线程执行例程中需要调用run方法,而如果此时对象已销毁,则会找不到对应的虚函数。这个限制使得在需要创建需要detach线程时,new出来的common_thread_t对象,没有合适的时机来delete,因为不知道detach后的线程何时结束


2011年11月22日补充:
为了解决堆上创建线程释放的问题,可以使用boost::shared_ptr,让thread的run函数thread对象的的shared_ptr,使得在线程函数执行的过程中thread对象一直不会释放,等其线程函数执行完后才会被释放。

实现参考:https://gist.github.com/1384659 (作者:陈硕)

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值