#define INVALID_RESOUCE 0xFFFFFFFF
struct resouce_manager
{
int pool_size;
int pool_head;
int resouce_left;
int resouce_pool[1]; /* resouce_pool[0] 's value means invalid */
};
struct resouce_manager * get_resouce_manager(int size)
{
int i;
struct resouce_manager * manager = malloc(sizeof(struct resouce_manager) + size * sizeof(int));
if (manager == NULL)
return NULL;
manager->pool_size = size;
manager->pool_head = 1;
manager->resouce_left = size;
manager->resouce_pool[0] = INVALID_RESOUCE;
for (i = 1; i <= size; ++i)
{
manager->resouce_pool[i] = i;
}
return manager;
}
void release_resouce_manager(struct resouce_manager * manager)
{
if (manager)
free(manager);
}
int obtain_resouce(struct resouce_manager * manager)
{
int resouce;
if (manager->resouce_left)
{
manager->resouce_left--;
resouce = manager->resouce_pool[manager->pool_head];
manager->pool_head++;
if (manager->pool_head > manager->pool_size)
manager->pool_head -= manager->pool_size;
}
else
{
resouce = manager->resouce_pool[0];
}
return resouce;
}
void release_resouce(struct resouce_manager * manager, int resouce)
{
int pool_tail;
if (manager->resouce_left == manager->pool_size)
return;
pool_tail = manager->pool_head + manager->resouce_left;
if (pool_tail > manager->pool_size)
pool_tail -= manager->pool_size;
manager->resouce_left++;
manager->resouce_pool[pool_tail] = resouce;
}
以上代码实现了一个简单的资源池管理,是的通过obtain_resouce获得的资源是资源管理池中空闲事件最长的。当该资源不用的时候,通过release_resouce释放资源到相应的资源池中
可对资源管理池的初始化函数进行调整,将资源的初始化位置设定。几个实现轮询。
当然通过链表组成队列也可以简单的实现该功能。但是链表操作相对与数组操作比较负责,需要管理大量的节点,并且涉及到大量的内存申请与释放。比较负责,代码量也比较大。