zthread学习 实例五 非任务对象的生存期
来源:互联网 发布:tomcat端口有哪些 编辑:程序博客网 时间:2024/04/30 13:34
在使用线程处理时,必须确保非任务对象在任务需要它们的时候长期保留在活动状态,如果在任务完成之前,那些被任务使用的非任务对象已经被销毁,此时会导致非法访问存储单元。因此,那些被共享的非任务对象总要在堆中new出来,并且确保没有其他任务对象引用它时才动态销毁,此时就是引用计数。
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对象。
0 0
- zthread学习 实例五 非任务对象的生存期
- zthread学习 实例五 非任务对象的生存期
- zthread学习 实例一
- zthread学习 实例二
- zthread学习 实例十二 ZThread库基本结构的规纳
- zthread学习 实例十五ZThread库基本结构的规纳
- zthread学习 实例十 线程间的协助(一)
- zthread学习 实例十 线程间的协助(二)
- zthread学习 实例十 线程间的协助(一)
- zthread学习 实例十一 线程间的协助(二)
- 对象生存期
- 管理对象生存期
- zthread学习 实例八 任务终止(一)——观赏植物园
- zthread学习 实例九 任务终止(二)——中断方式
- zthread学习 实例八 任务终止(一)——观赏植物园
- zthread学习 实例九 任务终止(二)——中断方式
- 对象的生存期——变量的生存期与可见性
- 对象的生存期和自由存储对象
- uva 202求循环小数
- C++中为什么要将析构函数设为virtual
- zthread学习 实例四 让步、休眠、优先级
- [Python]网络爬虫(一):抓取网页的含义和URL基本构成
- Matlab中一个很有用的函数:regionprops
- zthread学习 实例五 非任务对象的生存期
- [Python]网络爬虫(二):利用urllib2通过指定的URL抓取网页内容
- JSP页面显示倒计时
- 简明Vim练级攻略
- LeetCode---(83) Remove Duplicates from Sorted List
- struts2的Container
- 大数的减法
- boost asio学习笔记(1) echo服务端
- zthread学习 实例六 访问控制