全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Jim_King_2000兄弟,singleton是不用new的。如果用了new,在什么地方去delete它呢?singleton原理的基础是局部static变量。C/C+ codeclass Singleton private: static Singleton *instance; Singleton() public: static Singleton *GetInstance() static Singleton singleton; return &singleton ; 这种局部static变量只有在函数被调用的第一次才被创建,随着程序的结束而结束。Modern C+ Design这本书里面对Singleton有详细的实现,包括相互依赖的Singleton实现。推荐LZ翻翻。zenny_chen你这个方法实现singleton不太好,会有多线程同步问题。比如说一开始Singleton:instance为空。然后有线程A和线程B同时访问Singleton:GetInstance()。有意思的是当任务A执行if (NULL = instance)这句时,刚判断好instance确实为空想调用new,或者时间可以再放款到正在执行new操作,但是还没有返回;要命的是调度器由于某些原因一下子剥夺了线程A的执行又去执行线程B了。线程B顺利地创建了一个instance实例,然后在某一时刻被调度器剥夺,再次执行线程A。OK,此时线程A从刚才的混沌中继续执行它的new Singleton()的操作,这样线程A所创建出来的就是另一个实例了。此时Singleton宣告破灭。因此,能够迎合多线程,乃至多处理的单件处理可以用以下方式:C/C+ codeclass Singleton private: static Singleton instance; Singleton(void) public: static Singleton& GetInstance() return instance; ;Singleton Singleton:instance;由于以上代码中,Singleton:instance在程序加载后由初始化程序建立,因此对于应用程序不会有多线程困扰。如果是在多处理器或多核处理器环境下还要注意Singleton的成员函数中的一些同步。回复Jim_King_2000:在C+中使用singleton不用new主要不是因为要担心如何delete。如果你的应用程序指明了一个接收到一个消息,由专门一个任务相应析构这个singleton实例,可以显式地调用其析构函数:Singleton:GetInstance().Singleton();个人认为多任务机制下,用楼主的方法不太合适。而Jim_King_2000你的方法也有多线程问题。因为局部static也不会对实例创建的操作原子化,除非构造函数内部具有锁机制。或者也是通过某种消息相应或通过状态表示要创建一个Singleton实例,以确保在第一次调用Singleton:GetInstance()时只有一个任务执行,且操作过程中不被打断,至少被打断后不会被重入。to zenny_chen:你的方法有效率问题。只要使用了你的类,这个静态对象都会被创建,无论该对象是否被用户使用。如果该对象的构造和析构十分费时的话,这样的方法会使效率大大降低。况且你的方法也并不能保证多线程安全。你怎么知道静态的instance在构造的时候没有别的线程正在调用GetInstance函数?=如果你的应用程序指明了一个接收到一个消息,由专门一个任务相应析构这个singleton实例,可以显式地调用其析构函数:Singleton:GetInstance().Singleton();=如果应用程序没有用消息怎么办?就算使用了消息,你怎么知道其它线程不需要Singleton对象了?万一程序非正常退出怎么办(比如遇到未处理的异常或者非法操作)?=而Jim_King_2000你的方法也有多线程问题。=1、我真的很希望这是我的方法。可惜现实不是这样。这个方法属于Scott Meyers。2、这个方法是实现singleton的基础。很多种singleton实现(如相互依赖的singleton,多线程下的singleton等等)都是依据这个方法实现的。3、很多实现在一开始的时候并不考虑多线程。等到单线程的实现方法出来以后,再扩展到多线程上面或者由用户自行加锁。STL也并不是多线程的。但这并不影响使用,你自己加锁就是了。所以说singleton里面不用new并不是因为多线程。而是没有必要用new。建议你也翻翻Modern C+ Design。里面有多线程singleton的实现。To 楼上:呵呵,在大多数场合我要让应用程序一直使用这个Singleton实例。因此,我将它放在全局数据存储区是个不错的主意,尤其在嵌入式系统中甚至可以将它放入ROM中。因此,在嵌入式系统中,这个实例在机器引导后就存在了,直到复位或关机。所以你说我还要对它在程序运行时进行创建或析构就显得荒谬了。而本人没那么多时间去读那些号称为C+大师们写的东西,我感兴趣的部分是基于多核处理器的操作系统以及并行计算,和人工智能等问题。to 楼上:=在大多数场合我要让应用程序一直使用这个Singleton实例=我们不应该假设这样的场合。你的assumption不具有通用性。如果用户的程序需要运行时创建singleton或者根本不创建某个singleton对象会怎样?如果用户只需要创建几个不同的singleton对象中的一个或几个(非全部)会怎么样?=尤其在嵌入式系统中甚至可以将它放入ROM中=同样,这仍然不具有通用性。Singleton是可以根据需要创建的,这样会大大限制了singleton的使用场合。=因此,在嵌入式系统中,这个实例在机器引导后就存在了,直到复位或关机。所以你说我还要对它在程序运行时进行创建或析构就显得荒谬了。=我们不应该假设这样的场合,用户的代码不一定运行在嵌入式系统上。就算是在嵌入式系统中,singleton仍然可以根据需要创建,Scott Meyers的方法也适用,我们只要在应用程序开始的时候调用初始化函数(也就是包含singleton对象的定义的那个函数)即可。=而本人没那么多时间去读那些号称为C+大师们写的东西=真没时间就算了,如果有时间的话,还是要看一下。我们学数学,看得就是大师们的成果;你学人工智能,书上的内容也是大师的成果;学C+也一样。To Jim_King_2000 :实际上在你的代码中,由于使用了static,尽管在函数内,但是在加载器加载你的应用程序时仍然会为你的全局唯一的Singleton预留空间。只不过在调用GetInstance()时才调用构造函数(若有的话)。而我的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东广州有轨电车有限责任公司校园招聘启动笔试历年典型考点题库附带答案详解试卷3套
- 2025国核自仪系统工程有限公司校园招聘笔试历年备考题库附带答案详解试卷3套
- 2025中钞特种防伪科技有限公司招聘18人笔试历年备考题库附带答案详解试卷3套
- 2025中国信达重庆分公司校园招聘5人笔试历年备考题库附带答案详解试卷3套
- 福建公务员考试邓轩试题及答案
- xx市燃气供排水基础设施建设项目技术方案
- 电大公务员制度考试试题及答案
- 研学基地特色活动设计方案
- 成都市工程类公务员考试试题及答案
- 污水处理设施项目建设工程方案
- SA8000-2026社会责任管理体系新版的主要变化及标准内容培训教材(可编辑!)
- 医院安全生产事故隐患内部报告奖励制度
- (初级)小红书种草营销师认证考试真题试题(附答案)
- 学校信息化2.0培训
- 微生物检验课件
- 湖南省市政排水设施维护工程消耗量标准2025
- 2024-2025学年广东省深圳市罗湖区六年级(上)期中数学试卷
- 人工智能技术赋能文创产品创新设计路径
- 当归种植创新创业项目商业计划书
- 2025年户外探险领队实务操作考试试卷及答案
- 2025年吊车证考试题目及答案
评论
0/150
提交评论