[ACE] ACE_Free_List
2009-12-01 21:06:37| 分类:
net_ACE
| 标签:
|举报
|字号大中小 订阅
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。
评论这张
转发至微博
转发至微博
评论