之前一直是使用C语言,前段时间转做C++。无论使用什么语言,多线程编程都是不可或缺的。最近项目中又用到了线程,现在将线程的封装做出总结:

1、线程类中应该包含线程ID、线程的状态以及线程基本操作等。

2、线程需要的基本操作都差不多,唯一不同的是线程执行的函数体。因此大多数操作都可以写在基类中,当需要使用线程时,只需要继承该基类并且实现run函数即可。

基类的定义如下:

 /*线程基类,封装了线程常用的操作,以后需要使用线程时,只需要继承该类并实现Run函数既可*/
class CThread {
public: /*如果不需要为线程传参数,则可以使用这个构造函数*/
CThread()
{
m_ThreadId = ; m_iThreadStatus = ; m_vpParameter = NULL;
} /*重载构造函数,该构造函数可以为线程传参数*/
CThread(void *vpParameter)
{
m_ThreadId = ; m_iThreadStatus = ; m_vpParameter = cpParameter;
} virtual ~CThread(); /*线程的启动函数,在该函数中将会创建线程*/
int Start(void *Parameter); /*线程的回调函数,在该函数中只是转调run函数*/
static void *ThreadCall(void *vpParameter); /*获取线程ID*/
pthread_t GetThreadId()
{
return this->m_ThreadId;
} /*获取线程状态*/
int GetThreadStatus()
{
return m_iThreadStatus;
} /*获取线程状态*/
int GetThreadStatus(); /*线程真正工作的函数,这个函数需要在派生类中实现*/
virtual void *Run(void *Parameter) = ;
protected: //线程的Id号
pthread_t m_ThreadId; //线程状态
int m_iThreadStatus; //线程参数
void* m_vpParameter;
}; inline pthread_t CThread::GetThreadId()
{
return this->m_ThreadId;
}

  在线程的回调函数中,只是转掉函数Run。这样设计的原因是因为在C++的回调函数必须是全局函数或者是静态成员函数,否则编译不会通过。而全局函数没有虚函数一说,也没有继承一说(静态函数也没有,静态函数只是限制了作用域的全局函数)。Start函数与线程的回调函数实现如下:

 int CThread::Start(void *vpParameter)
{
int ret = pthread_create(&(this->m_ThreadId), NULL, CThread::ThreadCall, vpParameter);//该函数中创建线程
if( == ret)
{
return TRUE;
} return FAULT;
} void *CThread::ThreadCall(void *vpParameter)//线程回调函数
{
void *vpRet;
CThread *pObj = static_cast<CThread *>(vpParameter);//将指针强制性转化成对象 vpRet = pObj->Run(m_vpParameter);//调用线程正在执行的函数 return vpRet;
};

总结:这样设计以后,程序中如果需要其它使用其它线程,可以继承该基类,然后实现Run函数即可。如果需要线程等待等操作则需要在里面添加内容。

linux下C++对线程的封装的更多相关文章

  1. Windows和Linux下通用的线程接口

    对于多线程开发,Linux下有pthread线程库,使用起来比较方便,而Windows没有,对于涉及到多线程的跨平台代码开发,会带来不便.这里参考网络上的一些文章,整理了在Windows和Linux下 ...

  2. linux下将不同线程绑定到不同core和cpu上——pthread_setaffinity_np

    =============================================================== linux下的单进程多线程的程序,要实现每个线程平均分配到多核cpu,主 ...

  3. [转] linux 下 进程和线程的区别

    1.进程与线程 进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(CPU时间.内存等)的基本单位. 线程是进程的一个执行流,是C ...

  4. [进程管理]linux 下 进程和线程的区别(baidu 面试)

    进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(CPU时间.内存等)的基本单位. 线程是进程的一个执行流,是CPU调度和分派的 ...

  5. linux 下 进程和线程的区别

    1.进程与线程 进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(CPU时间.内存等)的基本单位. 线程是进程的一个执行流,是C ...

  6. 在Linux下写一个线程池以及线程池的一些用法和注意点

    -->线程池介绍(大部分来自网络)  在这个部分,详细的介绍一下线程池的作用以及它的技术背景以及他提供的一些服务等.大部分内容来自我日常生活中在网络中学习到的一些概念性的东西. -->代码 ...

  7. Linux下C的线程同步机制

    C里提供了保证线程安全性的三种方法: (添加头文件#include<pthread.h>,pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a, ...

  8. Linux下进程与线程的区别及查询方法

    在平时工作中,经常会听到应用程序的进程和线程的概念,那么它们两个之间究竟有什么关系或不同呢?一.深入理解进程和线程的区别 1)两者概念 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进 ...

  9. 4、linux下应用创建线程

    1.linux创建线程之pthread_create 函数简介 pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int p ...

随机推荐

  1. iOS 开发者证书总结

    iOS 证书分两种类型. 第一种为$99美元的,这种账号有个人和公司的区别,公司账号能创建多个子账号,但个人的不能.这种账号可以用来上传app store 第二种为¥299美元的,这种账号只能用于企业 ...

  2. ios 异步多线程 获取数据

    简介 iOS有三种多线程编程的技术,分别是: (一)NSThread  (二)Cocoa NSOperation (三)GCD(全称:Grand Central Dispatch)   这三种编程方式 ...

  3. OD调试2---TraceMe

    OD调试2---TraceMe 拆解一个Windows程序要比拆解一个DOS程序容易得多,因为在Windows中,只要API函数被使用,想对寻找蛛丝马迹的人隐藏一些东西是比较困难的.因此分析一个程序, ...

  4. hibernate中.hbm.xml和注解方式自动生成数据表的简单实例(由新手小白编写,仅适用新手小白)

    绝逼新手小白,so 请大神指点! 如果真的错的太多,错的太离谱,错的误导了其他小伙伴,还望大神请勿喷,大神请担待,大神请高抬贵嘴......谢谢. 好了,正题 刚接触ssh,今天在搞使用.hbm.xm ...

  5. 垃圾回收GC——JVM之七

    垃圾回收是个复杂的过程: 请以此阅读下列文章: 垃圾回收1:http://blog.csdn.net/sun305355024sun/article/details/41394729 垃圾回收2:ht ...

  6. (转)使用scp命令在linux操作系统之间传递文件

    一.关于scp scp是英文secure copy (remote file copy program)的简称,主要用于在两台主机之间通过网络拷贝文件.scp使用ssh协议进行数据传递,其认证方式和安 ...

  7. C语言随笔_return答疑

    1. 例子,看实例2-2.这道题有同学会问,那个return有什么用?这么讲吧,return是个英文单词,中文意思是“返回”,用在程序里也是返回的意思,返回啥呢?返回一个值.在func函数中,retu ...

  8. UESTC_最少花费 2015 UESTC Training for Dynamic Programming<Problem D>

    D - 最少花费 Time Limit: 30000/10000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  9. 剑指offter-面试题7.用两个栈实现队列

    题目.用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead 分别完成在对尾插入节点和在队头删除节点. 该队列类模板如下: template <typ ...

  10. poj1833 排列

                                                                                                         ...