zthread学习 实例五 非任务对象的生存期
2011-05-22 11:27
260 查看
在使用线程处理时,必须确保非任务对象在任务需要它们的时候长期保留在活动状态,如果在任务完成之前,那些被任务使用的非任务对象已经被销毁,此时会导致非法访问存储单元。因此,那些被共享的非任务对象总要在堆中new出来,并且确保没有其他任务对象引用它时才动态销毁,此时就是引用计数。
ZThread库有一个引用计数的模板CountedPtr<>,它自动执行引用计数(执行拷贝构造函数时),并在引用计数归0时delete这个对象。每当有对象有被多于一个任务使用时,几乎总是需要使用CountedPtr<>来管理那些对象,以防由对角生存期争端而产生的问题。
代码中注释起来的在栈中定义的CCount对象,会出现非法访问的错误。
而由CountedPtr<>模板管理的CCount对象,在任务两次对它引用时都会增1,只要任务运行,计数就会非0,当使用CCount对象的所有任务全部完成时(此时引用计数归0),才会delete CCount对象。
ZThread库有一个引用计数的模板CountedPtr<>,它自动执行引用计数(执行拷贝构造函数时),并在引用计数归0时delete这个对象。每当有对象有被多于一个任务使用时,几乎总是需要使用CountedPtr<>来管理那些对象,以防由对角生存期争端而产生的问题。
#include "stdafx.h" #include <iostream> #include <fstream> #include "zthread/Thread.h" #include "zthread/Runnable.h" #include "zthread/PoolExecutor.h" using namespace ZThread; using namespace std; class CCount { public: void increment() { for (int i = 0; i < 100; i ++) { n[i]++; } //n++; } private: int n[100]; //int n; }; class Incrementer : public Runnable { public: //Incrementer(CCount* pC) : pCount(pC){} Incrementer(const CountedPtr<CCount>& pC) : pCount(pC){} void run() { for (int i = 100; i > 0; i--) { Thread::sleep(100); pCount->increment(); cout << i << endl; } } private: //CCount* pCount; CountedPtr<CCount> pCount; }; int _tmain(int argc, _TCHAR* argv[]) { //CCount count; CountedPtr<CCount> pCount(new CCount); try { //Thread t0(new Incrementer(&count)); //Thread t1(new Incrementer(&count)); Thread t0(new Incrementer(pCount)); Thread t1(new Incrementer(pCount)); } catch (Synchronization_Exception& e) { cerr << e.what() <<endl; } return 0; }
代码中注释起来的在栈中定义的CCount对象,会出现非法访问的错误。
而由CountedPtr<>模板管理的CCount对象,在任务两次对它引用时都会增1,只要任务运行,计数就会非0,当使用CCount对象的所有任务全部完成时(此时引用计数归0),才会delete CCount对象。
相关文章推荐
- zthread学习 实例五 非任务对象的生存期
- zthread学习 实例八 任务终止(一)——观赏植物园
- zthread学习 实例九 任务终止(二)——中断方式
- zthread学习 实例八 任务终止(一)——观赏植物园
- Activiti工作流学习(二)流程实例、执行对象、任务
- zthread学习 实例九 任务终止(二)——中断方式
- Activiti学习笔记六 流程实例 任务 执行对象控制流程执行
- Bootstrap学习笔记之进度条、媒体对象实例详解
- oracle学习之路--数据库实例、方案、用户、表空间、表对象之间的关系
- PHP对象序列化实例学习
- Jquery Ajax学习实例4-向WebService发出请求,返回实体对象的异步调用
- zthread学习 实例四 让步、休眠、优先级
- Activiti 流程实例、任务、执行对象及相关的表
- jQuery源码学习之三 (jQUery对象的实例属性和方法)
- Python学习笔记_类,类对象,实例对象
- Java学习日记之类和对象:静态成员与实例成员
- lua面向对象学习随笔 --类与实例
- 【面向对象课程项目:纸牌】Java实例学习(三):对自己代码的修正与加壳(仍然要对比源码)
- Quartz.NET 2.0 学习笔记(5) :实例创建Windows服务实现任务调度 Quartz.NET 项目地址 http://quartznet.sourceforge.net/ Quar