线程基类的构建与代码实践
- 在C++中常用到线程来执行相应的任务,一般会构建一个线程基类,其他的线程类型通过继承的方式来实现不同的功能。
- 所实现的代码考虑了windows和linux平台的兼容性,且具有代表性,在工程实践中具有参考价值。
- 在创建线程时,对线程的属性进行了设置,如堆栈大小,以及设置线程为分离状态,从而可以在线程结束时可自动释放资源。
- 提供一个整体性的线程框架,继承该基类的线程只要实现相应的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
线程基类的构建与代码实践相关推荐
- java 线程 基类_关于Linux 系统下 C++ 的多线程基类 Thread
最近在Linux 下用C++做的东西,原来是使用"多进程"方式实现,现在随着工程的增大,"多进程"的"变量共享"问题已经十分突出了,虽然可以 ...
- 【机器学习基础】(三):理解逻辑回归及二分类、多分类代码实践
本文是机器学习系列的第三篇,算上前置机器学习系列是第八篇.本文的概念相对简单,主要侧重于代码实践. 上一篇文章说到,我们可以用线性回归做预测,但显然现实生活中不止有预测的问题还有分类的问题.我们可以从 ...
- 机器学习:理解逻辑回归及二分类、多分类代码实践
作者 | caiyongji 责编 | 张红月 来源 | 转载自 caiyongji(ID:cai-yong-ji) 本文的概念相对简单,主要侧重于代码实践.现实生活中不止有预测的问题还有分类的问 ...
- 不是抽象类的基类不是好基类
开宗明义:不是抽象类的基类不是好基类.为什么这么说? 基类和派生类的关系有如下几种: 基类可以是具体类.虚类和抽象类三种,对派生类没有要求.其中具体类是没有虚函数的类,其所有方法都提供了具体实现:派生 ...
- 机器学习(三):理解逻辑回归及二分类、多分类代码实践
本文是机器学习系列的第三篇,算上前置机器学习系列是第八篇.本文的概念相对简单,主要侧重于代码实践. 上一篇文章说到,我们可以用线性回归做预测,但显然现实生活中不止有预测的问题还有分类的问题.我们可以从 ...
- java 虚基类_C++中虚基类与抽象类的简单理解。
虚基类 是相对于它的派生类而言的,它本身可以是一个普通的类. 只有它的派生类虚继承它的时候,它才称作虚基类,如果没有虚继承的话,就称为基类.比如类B虚继承于类A,那类A就称作类B的虚基类,如果没有 ...
- 38.【C++ 虚函数 纯虚函数 虚基类 (最全详解)】
虚函数.虚基类.纯虚函数 (一).虚函数 1.什么是虚函数: 2.虚函数的格式: 3.关于虚函数的注意事项: 4.虚函数的作用: 5.虚函数访问格式 6.虚函数的各种疑难杂症 [当指针是基类.但虚函数 ...
- 请确保此代码文件中定义的类与“inherits”属性匹配,并且该类扩展的基类(例如Page 或UserControl)是正确的。...
编译ASP.NET时,提示"请确保此代码文件中定义的类与"inherits"属性匹配,并且该类扩展的基类(例如Page 或UserControl)是正确的.", ...
- C++编程进阶6(public继承与组合、private继承、多重继承、处理模板基类内的名称、如何避免模板代码膨胀)
二十一.public继承与组合 public继承是是子类对象is a基类对象的关系,比如QT中的所有组件类都要继承QObject,所以所有的QT组件都是一个QObject. 而组合是has a(包含) ...
最新文章
- Python中如何拷贝一个对象?(赋值、深拷贝、浅拷贝的区别)
- 食品安全溯源区块链解决方案探索-转载
- 三星会使用华为的鸿蒙系统,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可
!【手机吧】_百度贴吧...
- 在线ocr文字识别_PandaOCR:最佳免费 OCR 文字识别工具
- 高能力成熟度软件企业中软件质量工程师的职责
- C++基础11-类和对象之操作符重载1
- go语言web开发 排坑指南
- 一切问题的解决都离不开人
- 使用data attributes
- Ubuntu免密码输入关机脚本
- 【Java】菜鸟教程个人Java学习笔记
- Taro框架中开发H5使用微信分享
- 杭电OJ 1094(C++)
- 5.12 利用图层蒙版制作图像合成特效 [原创Ps教程]
- 强化学习从K-摇臂老虎机开始
- c语言幂函数_了解C / C ++中的幂函数
- SVN如何建立版本库
- 什么是redux?redux概念及应用
- 2021五款头戴式蓝牙耳机分享,高清音质超轻超舒适,平价最强推荐
- daytime协议的服务器和客户端程序,用socket套接字实现daytime协议的服务器和客户端程序精编版.doc...