ace allocator 和 singleton 的线程安全
来源:互联网 发布:mac os 应用程序 推荐 编辑:程序博客网 时间:2024/04/29 13:00
最近因为需要,继承实现了一个 ace_cached_allocator的分配器,理由是原本的ace_cached_allocator的实现不提供自增长的功能,当申请超过预分配的大小个数时,内存池将返回NULL。而提供动态增长的ace_local_memory_pool由于支持动态长度而显得不那么高效,项目需要的是定长的快,为专有块提供专有的memory_pool。实现起来也很简单,继承ace_new_allocator, 实现malloc ,calloc, free 三个接口,内部用简单的链表把块和freeblock相连就完事了。但测试起来就没那么顺利了,多线程下跑一会就有问题。查看了一下发现问题在于对ace线程安全策略理解有误有关。
内存池用的是单件模式, ace_singleton<ace_cached_allocator_ex<data,ace_lock1 >,ace_lock2> 一开始我认为 ace_lock1 和 ace_lock2 择1则可,因为单件使用时lock了,内存池就安全了。结果ace_lock1 就用的 是 ace_synch_null_mutex ,ace_lock2 用 ace_synch_mutex 。结果自然是悲剧,后来查看了一下这2个模板的实现发现 ace_lock2 虽然保住了ace_singleton的线程安全,但仅仅保证的是在取得这个单件的时候,至于单件以后的使用是非安全的。而ace_lock2才是真正保证内存池中malloc和free时候的链表安全的。如果觉得ace_lock1有了ace_lock2就不必了也有问题,因为ace_singleton本身在第一次取得的时候会用给static 变量赋值的方式完成初始化,没有ace_lock1以后难保会产生2份。
顺带提一下这种用模板的方式实现的锁本身会由于ace_synch_null_mutex 这种对象的空方法 达到编译后 非线程安全 方法的 调用效率。
- ace allocator 和 singleton 的线程安全
- singleton 线程安全的singleton
- 线程安全的singleton
- 线程安全的singleton
- 线程安全的singleton
- 线程安全的singleton实例
- 线程安全的C++的Singleton实现
- Reproduced:线程安全的 Singleton - Visual Basic
- 编写线程安全的单件(Singleton)
- c# SingleTon的线程安全(存档)
- python 线程安全的单例 singleton
- C++实现线程安全的Singleton
- Spring中Singleton模式的线程安全
- Spring中Singleton模式的线程安全
- Spring中Singleton模式的线程安全
- Spring中Singleton模式的线程安全
- Spring中Singleton模式的线程安全
- 线程安全的 C++ Singleton 实现
- span 设CSS样式总是不起作用
- Windows下安装ns2-2.29和leach各种方法和遇到的问题
- c#调用DLL在非开发机器上不能运行
- 将图片保存到一个XML文件
- VC2008 express编译QT4.5
- ace allocator 和 singleton 的线程安全
- Jazelle DBX对Android是无用的
- C#温故而知新学习系列之面向对象编程—3-类的数据成员
- 监听ContentProvider中数据的变化
- 将图片保存到一个XML文件
- 数据库常用语句(二)
- C#温故而知新学习系列之面向对象编程—4-方法
- C#怎么做一个永远没有焦点的窗口 类似输入法控制栏
- 在cocos2d中加入背景音乐和音效