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 语言协程库
随机推荐
- ZROI2018提高day4t2
传送门 分析 我们二分球的直径,然后就像奶酪那道题一样,将所有距离相遇直径的点用并查集连在一起,然后枚举所有与上边的顶距离小于直径的点和所有与下边的距离小于直径的点,如果它们被并查集连在一起则代表这个 ...
- Luogu 1314 [NOIP2011] 聪明的质监员
二分答案 + 前缀和. 题面中式子的意思是每一个区间$[l, r]$的贡献是这个区间内$w_i \geq W$的个数乘以这些$i$的$v_i$和. 很快发现了答案具有单调性,可以做两遍二分,分别看看小 ...
- Ubuntu jdk安装详细
安装jdk步骤: 1.首先连接130的ip地址,进去Tools拷贝jdk压缩文件(Tools中已经有下载好的jdk版本,也可自己另行下载) 2.将拷贝好的压缩文件解压 tar -zxvf 压缩文件名 ...
- ListBox 光标如何定位在最后一行 显示
richTextBox_show.SelectionStart = richTextBox_show.Text.Length - 1; richTextBox_show.Focus();
- Mac下的UI自动化测试 (四)
在实际写testcase的时候会使用unittest框架,但是在sikuli中需要使用它提供的command来运行,位于/Applications/SikuliX.app/run,使用-r参数指定要运 ...
- python:格式化输出整数
import math #default print "PI = %f" % math.pi #width = 10,precise = 3,align = left print ...
- JavaScript prototype原型链介绍
javascript 是一种基于原型的编程 (prototype based programming) 的语言, 而与我们通常的基于类编程 (class based programming) 有很大的 ...
- js 值传递,引用传递
参考:http://www.cnblogs.com/lcngu/p/5876273.html JS的基本类型,是按值传递的. 对象类型按共享传递的(call by sharing,也叫按对象传递.按对 ...
- CompletionService详解
public interface CompletionService<V> { Future<V> submit(Callable<V> task); Future ...
- P3879 [TJOI2010]阅读理解
\(\color{#0066ff}{ 题目描述 }\) 英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. \( ...