登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[ACE] ACE_Free_List  

2009-12-01 21:06:37|  分类: net_ACE |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

ACE_Free_List 定义了接口,而 ACE_Locked_Free_List 是 ACE 中 ACE_Free_List 的唯一实现。
ACE 很多部件使用了 ACE_Free_List,如此结构,允许使用者继承 ACE_Free_List,定义自己的内部结构、策略。

ACE_Free_List<T> (virtual)
                |
ACE_Locked_Free_List<T, ACE_LOCK>

-----------------------
ACE_Free_List 定义了 add, remove, size, resize 四个接口。

添删元素
virtual void add (T *element) = 0;
virtual T *remove (void) = 0;

剩余元素大小,改变 list 大小
virtual size_t size (void) = 0;
virtual void resize (size_t newsize) = 0;

-----------------------
从 ACE_Locked_Free_List 的实现中,察觉到其隐含了两种用法。
ACE_FREE_LIST_WITH_POOL, A free list which create more elements when there aren't enough elements。是 ACE_Locked_Free_List 本身一开始,就分配好一些 free node,供外部取用。在 remove() 时如果内部 node 不足,也会自动 alloc 更多的 node。
ACE_PURE_FREE_LIST, A simple free list which doen't allocate/deallocate elements.

当然,使用 ACE_Locked_Free_List 要求你的 T 实现了 get_next, set_next 两个接口。

----------- Main.cpp ------------
#include <ace/Null_Mutex.h>
#include <ace/Free_List.h>

template <class TYPE>
class MyNode_T
{
public:
        MyNode_T() : next_(0) {}
        MyNode_T(const TYPE &val) : val_(val), next_(0) {}

        // ACE_Free_List need it
        MyNode_T<TYPE> *get_next(void) { return this->next_; }
        void set_next(MyNode_T<TYPE> *next) { this->next_ = next; }

        // value method
        const TYPE &val(void) { return this->val_; }
        void val(const TYPE &val) { this->val_ = val; }

private:
        TYPE val_;
        MyNode_T<TYPE> *next_;

private:
        ACE_UNIMPLEMENTED_FUNC( MyNode_T(const MyNode_T<TYPE> &) )
        ACE_UNIMPLEMENTED_FUNC( void operator=(const MyNode_T<TYPE> &) )
};

typedef MyNode_T<int> IntNode;

void use1()
{
        ACE_Locked_Free_List<IntNode, ACE_Null_Mutex> intlist(ACE_FREE_LIST_WITH_POOL);

        // alloc, use it
        IntNode *n1 = intlist.remove();
        n1->val(1);

        IntNode *n2 = intlist.remove();
        n2->val(2);

        // free it
        intlist.add(n1);
        intlist.add(n2);

        printf("=== 1 ===\n");
        while ( intlist.size() > 0 )
        {
                IntNode *tmp = intlist.remove();
                printf("val = %d\n", tmp->val());
        }
}

void use2()
{
        ACE_Locked_Free_List<IntNode, ACE_Null_Mutex> intlist(ACE_PURE_FREE_LIST);
        intlist.add( new IntNode(1) );
        intlist.add( new IntNode(2) );
        intlist.add( new IntNode(3) );

        printf("=== 2 ===\n");
        while ( intlist.size() > 0 )
        {
                IntNode *tmp = intlist.remove();
                printf("val = %d\n", tmp->val());
        }

        IntNode *tmp = intlist.remove();
        printf("t = %p\n", tmp); // = NULL
}

int main()
{
        use1();
        use2();
        return 0;
}

=== 1 ===
val = 2
val = 1
val = 0
val = 0
val = 0
... repeat [val = 0] ...
=== 2 ===
val = 3
val = 2
val = 1
t = 0x0
-------------------------------
其中 repeat [val = 0] 说明预分配的很多 node。

  评论这张
 
阅读(992)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018