业务逻辑提供者类"CLThreadFunctionProvider"

头文件:

View Code

#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

抽象类,用户自己提供业务逻辑,私有化复制构造函数和“=”操作符,保证对象访问的唯一性。
实现:

View Code

#include "CLThreadFunctionProvider.h"

CLThreadFunctionProvider::CLThreadFunctionProvider(){}

CLThreadFunctionProvider::~CLThreadFunctionProvider(){}

具体由用户实现。
线程类"CLThread"

头文件:

View Code

#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",因为没有用到具体的成员。
实现:

View Code

#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;}

调用:

View Code

#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学习之线程封装四:基于接口的封装相关推荐

  1. Cty的Linux学习笔记(十四)

    Linux学习笔记--第十四篇 环境变量配置文件: /etc/profile:预设了几个重要的变量,例如PATH,USER,LOGNAME,MAIL,INPUTRC,HOSTNAME,HISTSIZE ...

  2. Linux学习06——线程控制与同步互斥

    概述 学习目标: 理解线程概念和并发特征,分辨线程与进程的区别与联系 掌握多线程应用编程技术,掌握线程间数据传递基本方法 掌握共享变量识别方法,理解多线程访问共享变量可能带来的问题 理解临界资源.临界 ...

  3. Linux学习笔记(23)——基于wm8960的音频设备驱动

    根据WM8960与处理器接口SAI和I2C来修改设备树文件 a) 首先在i2c2节点下增加wm8960子节点 codec: wm8960@1a {compatible = "wlf,wm89 ...

  4. Linux学习笔记-线程的自然终止

    线程的自然终止 线程主函数退出时,该线程自然终止.例如,下面的线程运行10秒后终止 ... void* Thread_Main(void* context) {for(int i=0; i<10 ...

  5. 解封装(四):avformat_find_stream_info探测获取封装上下文并打印

    获取视频流格式信息 注意:MP4视频文件,在avformat_open_input的时候就已经获取了它全部的信息,但有一部分视频文件如flv格式的视频文件,在调用上面接口的时候可能并没有获取他的重要信 ...

  6. java封装插件,基于面向对象思想封装一个水球插件

    1 2 3 4 5 test 6 7 body{ 8 display:flex; 9 flex-flow:column wrap; 10 justify-content:center; 11 alig ...

  7. linux 学习之路

    很多同学接触Linux不多,对Linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机IT行业从业人员, 掌握Linux是一种很重要的谋生资源与手段. 下来我将 ...

  8. 零代码极限封装的【接口自动化测试框架】震碎你的三观

    随着互联网寒冬的到来,测试行业裁员的裁员,找工作的找工作,内卷越来越加剧,那么选择一个学习提升的平台尤为重要,接下来我要说的事情将震碎你的三观,震掉你的眼球,和每个测试人息息相关,测试人都必看. 先自 ...

  9. Linux学习笔记本(不定期持续更新)

    一.概述 2023年,打算系统自学一遍Linux,分享到这里来,和大家一起相互学习,探讨. 二.Linux基础知识 Linux学习环境搭建 学习每一门技术,系统环境很重要,好的系统环境能够极大提高学习 ...

最新文章

  1. OpenCV中的光流及视频特征点追踪
  2. 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强?
  3. 设置了hover伪类中有cursor:hand但是没有效果
  4. HDU 2852 KiKi's K-Number 主席树
  5. A. [2021.1.29多校省选模拟11]最大公约数(杜教筛/数论)
  6. 前端构建工具 Gulp.js 上手实例
  7. 如何便捷的获取AD(Altium Designer)封装、以及如何从PCB工程中导出封装库、封装库安装
  8. wifi射频设计指南
  9. 《如何让你爱的人爱上你》第一部分:第一印象
  10. Image Denoising Via Sparse and Redundant Representations Over Learned Dictionaries
  11. uniapp微信小程序自定义分享按钮
  12. 每个c语言程序文件的编译错误被分为什么,已打印中央电大C语言考试题库(c语言小题+编程)...
  13. 电信资费七宗罪,终端的故事
  14. 【时间复杂度】你还在担心时间复杂度太高吗?
  15. visual添加mysql.dll_MySQL.VisualStudio.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
  16. 蓝桥七届 搭积木 JAVA
  17. AtCoder Beginner Contest 151
  18. 周训练计划之(经典模式全身训练+有氧)
  19. 附指南原文下载-《GB/T 39725-2020 信息安全技术 健康医疗数据安全指南》解读(二)
  20. 字符串去除空格和回车

热门文章

  1. 说一说网站与搜索引擎之间不得不知的联系
  2. .net webapi 接收参数_FastReport.Net报表设计器如何连接到SQLCe
  3. python opencv 边缘检测_opencv-python-学习笔记十四(Canny边缘检测)
  4. 计算机输入法如何显示在桌面快捷方式,电脑输入法怎么设置快捷键
  5. matlab模块 python,Matlab 和Python结合使用
  6. harmonyos上的程序用什么语言写,HarmonyOS应用开发 — HelloWorld应用开发E2E体验
  7. (转载)配置apue.h
  8. 为什么一些人喜欢在java代码中能加final的变量都加上final
  9. mongodb c++ driver安装踩坑记
  10. SpringAOP 相关知识点总结