c++ 封装线程库 3
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的更多相关文章
- c++ 封装线程库 2
1.2线程回收: 首先得知道线程的两个状态: Joinable Detached 简单理解,如果一个线程是joinable的状态,那么这样的线程,就必须使用pthread_join来回收,否则程序结束 ...
- c++ 封装线程库 0
1.互斥锁简介 互斥锁主要用于互斥,互斥是一种竞争关系,用来保护临界资源一次只被一个线程访问. POSIX Pthread提供下面函数用来操作互斥锁. int pthread_mutex_init(p ...
- c++ 封装线程库 1
1.Pthread条件变量简介 条件变量也是线程间同步一个重要的内容,如果说互斥是一个种竞争关系,那么条件变量用于协调线程之间的关系,是一种合作关系. 条件变量的应用很多,例如:BlockingQue ...
- Linux posix线程库总结
由于历史原因,2.5.x以前的linux对pthreads没有提供内核级的支持,所以在linux上的pthreads实现只能采用n:1的方式,也称为库实现. 线程的实现,经历了如下发展阶段: Linu ...
- 引擎之旅 Chapter.2 线程库
预备知识可参考我整理的博客 Windows编程之线程:https://www.cnblogs.com/ZhuSenlin/p/16662075.html Windows编程之线程同步:https:// ...
- 【Jetlang】一个高性能的Java线程库
actor Jetlang 提供了一个高性能的Java线程库,该库是 JDK 1.5 中的 java.util.concurrent 包的补充,可用于基于并发消息机制的应用. .net的MS CCR ...
- Boost线程库学习笔记
一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...
- 【Node.js 自己封装的库 http_parse, libuv】
[Node.js 自己封装的库 http_parse, libuv] Node.js 介绍:一个网络框架,更多:http://www.oschina.net/p/nodejs 官网:http://no ...
- Arduino线程库ProtoThreads
参考: Arduino线程库ProtoThreads 一个“蝇量级” C 语言协程库
随机推荐
- yii2常用excel操作库
yii2使用较多的excel操作库 1."phpoffice/phpexcel" https://github.com/PHPOffice/PHPExcel/archive/1.8 ...
- discuz_ucenter_api_for_java的中文问题
我踩过的坑,希望你别掉进来. 云服务需要和UCENTER做对接,一个php,一个Java,幸好有了discuz_ucenter_api_for_java,帮我解决了大部分问题,为什么是大部分问题,因为 ...
- Batch Normalization参考博客
https://blog.csdn.net/whitesilence/article/details/75667002 https://blog.csdn.net/malefactor/article ...
- shape不同版本这间的兼容
在做那个只有左边上面是圆角和只有右边下边是圆角的时候,出现了一个问题,那就是在android3.0以前,android:bottomLeftRadius与android:bottomRightRadi ...
- 删除表中重复id值
DELETE t FROM (SELECT *,ROW_NUMBER()OVER(PARTITION BY test1,test2,test3,test4 ORDER BY RAND()) AS RN ...
- EchartJS平均线、最大值、最小值
1.先来看一个没有平均线.最大值.最小值的简单实例 option = { title: { text: '未来一周气温变化', subtext: '纯属虚构' }, tooltip: { trigge ...
- maven+selenium+java+testng+jenkins自动化测试
最近在公司搭建了一套基于maven+selenium+java+testng+jenkins的自动化测试框架,免得以后重写记录下 工程目录 pom.xml <project xmlns=&quo ...
- Springboot 实现前台动态配置数据源 (修改数据源之后自动重启)
1.将 db.properties 存放在classpath路径; driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3 ...
- python 矩阵(mat)操作
1.矩阵的创建 由一维或二维数据创建矩阵 a1=array([1,2,3]); a1=mat(a1); data1=mat(zeros((3,3))); #创建一个3*3的零矩阵,矩阵这里zeros函 ...
- 第一册:lesson 125.
原文: Tea for two. question:Does Susan have tea by herself? Can't you come in and have tea now Piter? ...