1. 继承与重写run方法

我们封装了Thread类,并设置成员函数run()为纯虚函数,因此我们使用类继承,并重写run方法:

class IncCount : public Thread//增加计数线程
{
private:
int id_;
public:
IncCount(int id):id_(id){}
void run()
{
for(int i=;i < ;i ++)
{
{
MutexLockGuard lock(mutex);
count++;
if (count == )
{
cond.notify();//通知
}
//打印信息方便调试
std::cout<<"thread : "<<id_<<" count : "<< count << std::endl;
}//临界区
sleep(1.5);//注:sleep不是同步原语,这里只是为了方便调试
}
}
};
class WatchCount: public Thread//监视线程
{
private:
int id_;
public:
WatchCount(int id):id_(id){}
void run()
{
MutexLockGuard lock(mutex);//加锁
while(count < )//这里用while防止虚假唤醒
{
cond.wait();
}
assert(count>=);
count+=;
std::cout<<"thread : "<<id_<<" count : "<< count << std::endl;
}
};

如果用多态的话,可以用vector来保存父类指针,并初始化指向子类引用,不过使用vector<Thread*>我们时常会有困惑,那就是vector作为栈上变量,其程序结束变量生命期结束,

而容器中的指针所指向的对象需要我们手动去delete,这样就会容易出错。

boost库中提供shared_ptr(c++11已经加入std),可以避免这种内存泄露的错误:vector生命期结束,shared_ptr释放,对象的引用计数变为0,也就自动释放资源了。

#include "Thread.h"
#include "MutexLock.h"
#include "Condition.h"
#include <vector>
#include <memory>
using namespace std;
MutexLock mutex;//互斥锁
Condition cond(mutex);//条件变量
int count =; int main()
{
{
vector< shared_ptr<Thread> > t(); t[].reset(new WatchCount());
t[].reset(new IncCount());
t[].reset(new IncCount());
for(int i=;i<;i++)
{
t[i]->start();
}
for(int i=;i<;i++)
{
t[i]->join();
} }
return ;
}

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

  1. c++ 封装线程库 2

    1.2线程回收: 首先得知道线程的两个状态: Joinable Detached 简单理解,如果一个线程是joinable的状态,那么这样的线程,就必须使用pthread_join来回收,否则程序结束 ...

  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. 21、conda下载,安装,卸载

    参考:https://www.cnblogs.com/Datapotumas/p/6293309.html 1.下载 conda下载网址:https://conda.io/miniconda.html ...

  2. GCD学习(六) dispatch_async 和dispatch_sync

    dispatch_sync(),同步添加操作.他是等待添加进队列里面的操作完成之后再继续执行. dispatch_queue_t concurrentQueue = dispatch_queue_cr ...

  3. 格式化字符串攻击原理及示例.RP

    格式化字符串攻击原理及示例 一.类printf函数簇实现原理 类printf函数的最大的特点就是,在函数定义的时候无法知道函数实参的数目和类型. 对于这种情况,可以使用省略号指定参数表. 带有省略号的 ...

  4. java全栈day04--方法

    day04内容介绍 1  方法基础知识 2  方法高级内容 3  方法案例 一  方法的概念 A:为什么要有方法 提高代码的复用性 B   什么是方法 完成特定功能的代码块 修饰符  返回值类型  方 ...

  5. 《Effective Java》第11章 序列化

    "将一个对象编码成一个字节流",称作将该对象序列化(serializing); 相反的处理过程被称作反序列化(deserializing),一旦对象被序列化后,它的编码就可以从一台 ...

  6. Markdown语法简介 | Markdown Tutorial

    Markdown是一种轻量级标记语言,允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的HTML文档. 与Word相比,使用Markdown最大的好处是可以使人们将注意力集中与文字本身而非排版 ...

  7. AU3获取系统激活信息

    If IsActivated() = False Then ;InstallProductKey($OSkey) ; installs a product key and also activates ...

  8. epoll简介

    1.epoll简介 epoll是I/O事件通知工具,与select/poll相比,epoll最大的好处在于它不会随着监听fd数目的增长而效率降低.epoll API既可以用作edge触发的接口,也可以 ...

  9. silverlight browse information

    public class Browser { /// <summary> /// During static instantiation, only the Netscape flag i ...

  10. get与post(转)

    如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历 前几天有人问我这个问题.我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用. 这个答案好像并不是他想要的.于是他继 ...