1. 在C++中常用到线程来执行相应的任务,一般会构建一个线程基类,其他的线程类型通过继承的方式来实现不同的功能。
  2. 所实现的代码考虑了windows和linux平台的兼容性,且具有代表性,在工程实践中具有参考价值。
  3. 在创建线程时,对线程的属性进行了设置,如堆栈大小,以及设置线程为分离状态,从而可以在线程结束时可自动释放资源。
  4. 提供一个整体性的线程框架,继承该基类的线程只要实现相应的work函数即可处理相应的任务。
class ThreadBase
{
protected:#ifdef LINUXpthread_t thread_id;
#endif
#ifdef WIN32HANDLE thread_id;
#endifpublic:bool run_flag;bool is_end;public:ThreadBase();~ThreadBase();int start();void stop();bool isEnd();virture int process(); //子类来重写
#ifdef LINUXstatic void* run(void* arg);
#endif#ifdef WIN32static void run(void* arg);
#endif}void stop()
{run_flag = false;
}bool isEnd()
{return is_end;
}int start()
{if (run_flag){return 0;}#ifdef LINUXpthread_attr_t thread_attr;pthread_attr_init(&thread_attr);pthread_attr_setstacksize(&thread_attr, 1024 * 10); //设置线程的堆栈大小pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);    //设置线程为分离状态,即当线程结束时会自动释放资源。若是未分离状态,需要在主线程中调用join来释放。int ret = pthread_create(&thread_id, &thread_attr, ThreadBase::run, (void*)this);if (ret != 0){printf("create failed, errno[%d],desc[%s]", errno, strerror(errno));pthread_attr_destroy(&thread_attr);return -1;}else{pthread_attr_destroy(&thread_attr);return 0;}
#endif    #ifdef WIN32thread_id = (HANDLE)_beginthread(ThreadBase::run, 0, (void*)this);if (thread_id == 0){return -1;}else{return 0;}
#endif    }int process()
{while(run_flag){work();}
}#ifdef LINUX
void* ThreadBase::run(void* arg)
{CThreadBase * pThread = (CThreadBase * )arg;pThread->run_flag = true;pThread->is_end = false;pThread->process();pThread->is_end = true;return NULL;
}
#endif#ifdef WIN32
void ThreadBase::run(void* arg)
{ThreadBase * pThread = (ThreadBase * )arg;pThread->run_flag = true;pThread->is_end = false;pThread->process();pThread->is_end = true;return;
}
#endifThreadBase::~ThreadBase()
{stop();
}
ThreadBase::ThreadBase()
{run_flag = false;is_end = true;
}

转载于:https://www.cnblogs.com/share-ideas/p/10886180.html

线程基类的构建与代码实践相关推荐

  1. java 线程 基类_关于Linux 系统下 C++ 的多线程基类 Thread

    最近在Linux 下用C++做的东西,原来是使用"多进程"方式实现,现在随着工程的增大,"多进程"的"变量共享"问题已经十分突出了,虽然可以 ...

  2. 【机器学习基础】(三):理解逻辑回归及二分类、多分类代码实践

    本文是机器学习系列的第三篇,算上前置机器学习系列是第八篇.本文的概念相对简单,主要侧重于代码实践. 上一篇文章说到,我们可以用线性回归做预测,但显然现实生活中不止有预测的问题还有分类的问题.我们可以从 ...

  3. 机器学习:理解逻辑回归及二分类、多分类代码实践

    作者 | caiyongji   责编 | 张红月 来源 | 转载自 caiyongji(ID:cai-yong-ji) 本文的概念相对简单,主要侧重于代码实践.现实生活中不止有预测的问题还有分类的问 ...

  4. 不是抽象类的基类不是好基类

    开宗明义:不是抽象类的基类不是好基类.为什么这么说? 基类和派生类的关系有如下几种: 基类可以是具体类.虚类和抽象类三种,对派生类没有要求.其中具体类是没有虚函数的类,其所有方法都提供了具体实现:派生 ...

  5. 机器学习(三):理解逻辑回归及二分类、多分类代码实践

    本文是机器学习系列的第三篇,算上前置机器学习系列是第八篇.本文的概念相对简单,主要侧重于代码实践. 上一篇文章说到,我们可以用线性回归做预测,但显然现实生活中不止有预测的问题还有分类的问题.我们可以从 ...

  6. java 虚基类_C++中虚基类与抽象类的简单理解。

    虚基类   是相对于它的派生类而言的,它本身可以是一个普通的类. 只有它的派生类虚继承它的时候,它才称作虚基类,如果没有虚继承的话,就称为基类.比如类B虚继承于类A,那类A就称作类B的虚基类,如果没有 ...

  7. 38.【C++ 虚函数 纯虚函数 虚基类 (最全详解)】

    虚函数.虚基类.纯虚函数 (一).虚函数 1.什么是虚函数: 2.虚函数的格式: 3.关于虚函数的注意事项: 4.虚函数的作用: 5.虚函数访问格式 6.虚函数的各种疑难杂症 [当指针是基类.但虚函数 ...

  8. 请确保此代码文件中定义的类与“inherits”属性匹配,并且该类扩展的基类(例如Page 或UserControl)是正确的。...

    编译ASP.NET时,提示"请确保此代码文件中定义的类与"inherits"属性匹配,并且该类扩展的基类(例如Page 或UserControl)是正确的.", ...

  9. C++编程进阶6(public继承与组合、private继承、多重继承、处理模板基类内的名称、如何避免模板代码膨胀)

    二十一.public继承与组合 public继承是是子类对象is a基类对象的关系,比如QT中的所有组件类都要继承QObject,所以所有的QT组件都是一个QObject. 而组合是has a(包含) ...

最新文章

  1. Python中如何拷贝一个对象?(赋值、深拷贝、浅拷贝的区别)
  2. 食品安全溯源区块链解决方案探索-转载
  3. 三星会使用华为的鸿蒙系统,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  4. 在线ocr文字识别_PandaOCR:最佳免费 OCR 文字识别工具
  5. 高能力成熟度软件企业中软件质量工程师的职责
  6. C++基础11-类和对象之操作符重载1
  7. go语言web开发 排坑指南
  8. 一切问题的解决都离不开人
  9. 使用data attributes
  10. Ubuntu免密码输入关机脚本
  11. 【Java】菜鸟教程个人Java学习笔记
  12. Taro框架中开发H5使用微信分享
  13. 杭电OJ 1094(C++)
  14. 5.12 利用图层蒙版制作图像合成特效 [原创Ps教程]
  15. 强化学习从K-摇臂老虎机开始
  16. c语言幂函数_了解C / C ++中的幂函数
  17. SVN如何建立版本库
  18. 什么是redux?redux概念及应用
  19. 2021五款头戴式蓝牙耳机分享,高清音质超轻超舒适,平价最强推荐
  20. daytime协议的服务器和客户端程序,用socket套接字实现daytime协议的服务器和客户端程序精编版.doc...

热门文章

  1. 【图像处理】透视变换 Perspective Transformation
  2. c语言函数的可选性自变量
  3. C#快速生成数据数组
  4. centos --- phpunit 安装过程
  5. 使用tortoise git管理gitolite版本库
  6. 如何着手学习一个新的PHP框架
  7. jquery设置属性值或移除属性
  8. (转)android UI进阶之用ViewPager实现欢迎引导页面
  9. 为WordPress添加favicon图标
  10. 命题模式持续在变 你变不变