1.2线程回收:

首先得知道线程的两个状态:

Joinable 
Detached

简单理解,如果一个线程是joinable的状态,那么这样的线程,就必须使用pthread_join来回收,否则程序结束时,线程所占用的资源不会释放,就会造成内存泄漏。

我们通常在主进程中会阻塞调用pthread_join来等待我们的线程结束。

如果是Detached状态的线程,那么在线程结束后,资源会自动释放,POSIX pthread线程库中,提供下面函数来让线程进入Detached状态:

int pthread_detach(pthread_t thread);

设计中,考虑pthread_join和pthread_detach的特性,分别对成员函数join和析构函数进程封装。

线程创建时默认情况情况下是Joinable状态。

2.线程封装

封装为一个C++ 类需要一些技巧:

1.Thread是没有拷贝构造和赋值语义的,因此也需要继承自boost::noncopyable
2.关于pthread_create的第三个参数(返回void*参数为void*的函数指针),因为成员函数会隐式包含this指针作为参数,所以加以static修饰。
3.对于pthread_create的第四个参数(void *arg作为线程参数),传入this指针方便线程调用成员函数。
4.使用join()成员函数封装pthread_join(),析构函数使用pthread_detach()处理。
5.设置run()成员函数为纯虚函数,子类重写run()方法。
class Thread : public boost::noncopyable
{
public :
Thread();
virtual ~Thread();//虚析构
void start();
void join();
virtual void run()=;//纯虚函数
pthread_t getThreadId() const
{
return threadId_;
}
private:
//pthread_create()第三个参数是一个回调函数,void*为返回值和参数
static void *runInThread(void *arg);
pthread_t threadId_;
bool isRunning_;
};
//这里对成员函数进行定义,run()由于是纯虚函数,我们放到子类中重写:
Thread::Thread():isRunning_(false),threadId_(){}//构造函数
Thread::~Thread()//析构函数
{
if(isRunning_)
{
CHECK(!pthread_detach(threadId_));//如果线程正在运行,则让其状态为detached
}
} void *Thread::runInThread(void *arg)
{
Thread *pt =static_cast<Thread*>(arg);//arg即为this指针
pt->run();//调用run方法
return NULL;
} void Thread::start()
{
CHECK(!pthread_create(&threadId_,NULL,Thread::runInThread,this));//创建线程
isRunning_=true;
} void Thread::join()
{
assert(isRunning_);
CHECK(!pthread_join(threadId_,NULL));//回收线程
isRunning_=false;
}

c++ 封装线程库 2的更多相关文章

  1. c++ 封装线程库 3

    1. 继承与重写run方法 我们封装了Thread类,并设置成员函数run()为纯虚函数,因此我们使用类继承,并重写run方法: class IncCount : public Thread//增加计 ...

  2. c++ 封装线程库 0

    1.互斥锁简介 互斥锁主要用于互斥,互斥是一种竞争关系,用来保护临界资源一次只被一个线程访问. POSIX Pthread提供下面函数用来操作互斥锁. int pthread_mutex_init(p ...

  3. c++ 封装线程库 1

    1.Pthread条件变量简介 条件变量也是线程间同步一个重要的内容,如果说互斥是一个种竞争关系,那么条件变量用于协调线程之间的关系,是一种合作关系. 条件变量的应用很多,例如:BlockingQue ...

  4. Linux posix线程库总结

    由于历史原因,2.5.x以前的linux对pthreads没有提供内核级的支持,所以在linux上的pthreads实现只能采用n:1的方式,也称为库实现. 线程的实现,经历了如下发展阶段: Linu ...

  5. 引擎之旅 Chapter.2 线程库

    预备知识可参考我整理的博客 Windows编程之线程:https://www.cnblogs.com/ZhuSenlin/p/16662075.html Windows编程之线程同步:https:// ...

  6. 【Jetlang】一个高性能的Java线程库

    actor  Jetlang 提供了一个高性能的Java线程库,该库是 JDK 1.5 中的 java.util.concurrent 包的补充,可用于基于并发消息机制的应用. .net的MS CCR ...

  7. Boost线程库学习笔记

    一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...

  8. 【Node.js 自己封装的库 http_parse, libuv】

    [Node.js 自己封装的库 http_parse, libuv] Node.js 介绍:一个网络框架,更多:http://www.oschina.net/p/nodejs 官网:http://no ...

  9. Arduino线程库ProtoThreads

    参考: Arduino线程库ProtoThreads 一个“蝇量级” C 语言协程库

随机推荐

  1. Linux shell实现阳历转农历

    闲来无事,想在Linux下用shell写一个阳历转农历的脚本,断断续续大概一个星期终于搞定.现在拿出来与大家分享. 缘由 本脚本实现原理是查表法(因为公式有误差):基于农历新年为基准,对农历新年前后两 ...

  2. Mat类

    1.Mat类 早期的opencv中,使用IplImage和CvMat数据结构来表示图像.IplImage和 CvMat 都是c语言的结构.使用这两个结构的问题是内存需要手动管理,开发者必须清楚的知道何 ...

  3. Entity Framework Tutorial Basics(31):Migration from EF 4.X

    Migration from Entity Framework 4.1/4.3 to Entity Framework 5.0/6.0 To migrate your existing Entity ...

  4. 形式化验证工具(PAT)Perterson Algorithm学习

    今天学习一下Perterson Algorithm. 这个算法是使用三个变量来实现并发程序的互斥性算法. 具体看一下代码: Peterson算法是一个实现互斥锁的并发程序设计算法,核心就是三个标志位是 ...

  5. iTween插件使用

    itween插件 itween是一个动画库,作者创建它的目的就是最小的投入实现最大的产出.用它可以轻松实现各种动画,晃动,旋转,移动.褪色.上色.控制音频等. iTween原理: itween的核心是 ...

  6. layui下select下拉框不显示或没有效果

    Layui会对select.checkbox.radio等原始元素隐藏,从而进行美化修饰处理.但这需要依赖于form组件,所以你必须加载 form,并且执行一个实例.值得注意的是:导航的Hover效果 ...

  7. CI框架源码学习笔记1——index.php

    做php开发一年多了,陆陆续续用过tp/ci/yii框架,一直停留在只会使用的层面上,关于框架内部的结构实际上是不甚了解的.为了深入的学习,决定把CI框架的源码从头到尾的学习一下, 主要因为CI框架工 ...

  8. ubuntu14.04 搭建samba

        1.安装软件      sudo apt-get remove libwbclient0      sudo apt-get remove samba-common      sudo apt ...

  9. 禁止百度转码和百度快照缓存的META声明

    今天手机 site 中国博客联盟时,发现网被转码了,虽然这个网站没做移动站,但是我也不希望被百度转码,因为这相当于拦截了所有来自手机的流量.下面说一下禁止百度转码和禁止百度快照缓存的方法. 一.禁止百 ...

  10. php字符串截取中文出现乱码解决

    在截取中文字符串时使用substr()容易出现乱码 可以使用mb_substr()用法与substr类似,但是比substr多了一个参数,第四个参数指定网页编码