Linux学习之线程封装四:基于接口的封装
业务逻辑提供者类"CLThreadFunctionProvider"
头文件:
#ifndef CLTHREADFUNCTIONPROVIDER_H#define CLTHREADFUNCTIONPROVIDER_H #include "CLStatus.h" class CLThreadFunctionProvider{public: CLThreadFunctionProvider();virtual ~CLThreadFunctionProvider(); public:virtual CLStatus RunThreadFunction(void *pContext) = 0; private: CLThreadFunctionProvider(const CLThreadFunctionProvider&); CLThreadFunctionProvider& operator=(const CLThreadFunctionProvider&);}; #endif
抽象类,用户自己提供业务逻辑,私有化复制构造函数和“=”操作符,保证对象访问的唯一性。
实现:
#include "CLThreadFunctionProvider.h" CLThreadFunctionProvider::CLThreadFunctionProvider(){} CLThreadFunctionProvider::~CLThreadFunctionProvider(){}
具体由用户实现。
线程类"CLThread"
头文件:
#ifndef CLTHREAD_H#define CLTHREAD_H #include <pthread.h>#include "CLStatus.h" class CLThreadFunctionProvider; class CLThread{public: CLThread(CLThreadFunctionProvider *pThreadFunctionProvider);virtual ~CLThread(); CLStatus Run(void *pContext = 0); CLStatus WaitForDeath(); private:static void* StartFunctionOfThread(void *pContext); protected:void *m_pContext; pthread_t m_ThreadID; CLThreadFunctionProvider *m_pThreadFunctionProvider;}; #endif
CLThreadFunctionProvider再投文件中只需声明,无需include "CLThreadFunctionProvider.h",因为没有用到具体的成员。
实现:
#include "CLThread.h"#include "CLLog.h"#include "CLThreadFunctionProvider.h" CLThread::CLThread(CLThreadFunctionProvider *pThreadFunctionProvider){ m_pThreadFunctionProvider = pThreadFunctionProvider; m_pContext = 0;} CLThread::~CLThread(){} CLStatus CLThread::Run(void *pContext){ m_pContext = pContext; int r = pthread_create(&m_ThreadID, 0, StartFunctionOfThread, this);if(r != 0) { CLLog::WriteLogMsg("In CLThread::Run(), pthread_create error", r);return CLStatus(-1, 0); } return CLStatus(0, 0);} CLStatus CLThread::WaitForDeath(){int r = pthread_join(m_ThreadID, 0);if(r != 0) { CLLog::WriteLogMsg("In CLThread::WaitForDeath(), pthread_join error", r);return CLStatus(-1, 0); } return CLStatus(0, 0);} void* CLThread::StartFunctionOfThread(void *pThis){ CLThread *pThreadThis = (CLThread *)pThis; CLStatus s = pThreadThis->m_pThreadFunctionProvider->RunThreadFunction(pThreadThis->m_pContext); return (void *)s.m_clReturnCode;}
调用:
#include <iostream>#include <unistd.h>#include "CLThread.h"#include "CLThreadFunctionProvider.h" using namespace std; class CLParaPrinter : public CLThreadFunctionProvider{public: CLParaPrinter() { } virtual ~CLParaPrinter() { } virtual CLStatus RunThreadFunction(void *pContext) {int i = (int)pContext; cout << i << endl; }}; int main(){ CLParaPrinter *printer = new CLParaPrinter(); CLThread *pThread = new CLThread(printer); pThread->Run((void *)2); pThread->WaitForDeath(); delete pThread; delete printer; return 0;}
转载于:https://www.cnblogs.com/lq0729/archive/2011/10/19/2218216.html
Linux学习之线程封装四:基于接口的封装相关推荐
- Cty的Linux学习笔记(十四)
Linux学习笔记--第十四篇 环境变量配置文件: /etc/profile:预设了几个重要的变量,例如PATH,USER,LOGNAME,MAIL,INPUTRC,HOSTNAME,HISTSIZE ...
- Linux学习06——线程控制与同步互斥
概述 学习目标: 理解线程概念和并发特征,分辨线程与进程的区别与联系 掌握多线程应用编程技术,掌握线程间数据传递基本方法 掌握共享变量识别方法,理解多线程访问共享变量可能带来的问题 理解临界资源.临界 ...
- Linux学习笔记(23)——基于wm8960的音频设备驱动
根据WM8960与处理器接口SAI和I2C来修改设备树文件 a) 首先在i2c2节点下增加wm8960子节点 codec: wm8960@1a {compatible = "wlf,wm89 ...
- Linux学习笔记-线程的自然终止
线程的自然终止 线程主函数退出时,该线程自然终止.例如,下面的线程运行10秒后终止 ... void* Thread_Main(void* context) {for(int i=0; i<10 ...
- 解封装(四):avformat_find_stream_info探测获取封装上下文并打印
获取视频流格式信息 注意:MP4视频文件,在avformat_open_input的时候就已经获取了它全部的信息,但有一部分视频文件如flv格式的视频文件,在调用上面接口的时候可能并没有获取他的重要信 ...
- java封装插件,基于面向对象思想封装一个水球插件
1 2 3 4 5 test 6 7 body{ 8 display:flex; 9 flex-flow:column wrap; 10 justify-content:center; 11 alig ...
- linux 学习之路
很多同学接触Linux不多,对Linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机IT行业从业人员, 掌握Linux是一种很重要的谋生资源与手段. 下来我将 ...
- 零代码极限封装的【接口自动化测试框架】震碎你的三观
随着互联网寒冬的到来,测试行业裁员的裁员,找工作的找工作,内卷越来越加剧,那么选择一个学习提升的平台尤为重要,接下来我要说的事情将震碎你的三观,震掉你的眼球,和每个测试人息息相关,测试人都必看. 先自 ...
- Linux学习笔记本(不定期持续更新)
一.概述 2023年,打算系统自学一遍Linux,分享到这里来,和大家一起相互学习,探讨. 二.Linux基础知识 Linux学习环境搭建 学习每一门技术,系统环境很重要,好的系统环境能够极大提高学习 ...
最新文章
- OpenCV中的光流及视频特征点追踪
- 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强?
- 设置了hover伪类中有cursor:hand但是没有效果
- HDU 2852 KiKi's K-Number 主席树
- A. [2021.1.29多校省选模拟11]最大公约数(杜教筛/数论)
- 前端构建工具 Gulp.js 上手实例
- 如何便捷的获取AD(Altium Designer)封装、以及如何从PCB工程中导出封装库、封装库安装
- wifi射频设计指南
- 《如何让你爱的人爱上你》第一部分:第一印象
- Image Denoising Via Sparse and Redundant Representations Over Learned Dictionaries
- uniapp微信小程序自定义分享按钮
- 每个c语言程序文件的编译错误被分为什么,已打印中央电大C语言考试题库(c语言小题+编程)...
- 电信资费七宗罪,终端的故事
- 【时间复杂度】你还在担心时间复杂度太高吗?
- visual添加mysql.dll_MySQL.VisualStudio.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
- 蓝桥七届 搭积木 JAVA
- AtCoder Beginner Contest 151
- 周训练计划之(经典模式全身训练+有氧)
- 附指南原文下载-《GB/T 39725-2020 信息安全技术 健康医疗数据安全指南》解读(二)
- 字符串去除空格和回车
热门文章
- 说一说网站与搜索引擎之间不得不知的联系
- .net webapi 接收参数_FastReport.Net报表设计器如何连接到SQLCe
- python opencv 边缘检测_opencv-python-学习笔记十四(Canny边缘检测)
- 计算机输入法如何显示在桌面快捷方式,电脑输入法怎么设置快捷键
- matlab模块 python,Matlab 和Python结合使用
- harmonyos上的程序用什么语言写,HarmonyOS应用开发 — HelloWorld应用开发E2E体验
- (转载)配置apue.h
- 为什么一些人喜欢在java代码中能加final的变量都加上final
- mongodb c++ driver安装踩坑记
- SpringAOP 相关知识点总结