// test_pool.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
//#ifndef __CONNECT_POOL_H__
//#define __CONNECT_POOL_H__
#include <queue>
#include <pthread.h>
template<class T>
class pool
{
public:
typedef T* pointer;
typedef T& reference;
public:
static pool& instance()
{
static pool p;
return p;
}
void init(T* ptr, int size)
{
for (int i = 0; i < size; i++)
__queue.push(&ptr[i]);
}
public:
pointer get()
{
pthread_mutex_lock(&__queue_cs);
while (__queue.size() <= 0)
pthread_cond_wait(&__queue_cv, &__queue_cs);
T* ptr = __queue.front();
__queue.pop();
pthread_mutex_unlock(&__queue_cs);
return ptr;
}
void set(T* ptr)
{
pthread_mutex_lock(&__queue_cs);
__queue.push(ptr);
pthread_cond_signal(&__queue_cv);
pthread_mutex_unlock(&__queue_cs);
}
private:
pthread_mutex_t __queue_cs;
pthread_cond_t __queue_cv;
std::queue<T*> __queue;
private:
pool()
{
pthread_mutex_init(&__queue_cs, NULL);
pthread_cond_init(&__queue_cv, NULL);
}
};
template<class T>
class database
{
friend class pool;
public:
typedef T* pointer;
typedef T& reference;
database()
{
__ptr = pool<T>::instance().get();
}
~database()
{
pool<T>::instance().set(__ptr);
}
public:
reference operator*() { return *__ptr; }
pointer operator->() { return __ptr; }
private:
T* __ptr;
};
class A
{public:
int a;
};
int main(int argc, char** argv)
{
A a[10];
for (int i = 0; i < 10; i++)
a[i].a = i;
pool<A>::instance().init(a, 10);
for (int j = 0; j < 10; j++)
{
database<A> d;
::printf("d.a = %d\n", d->a);
}
return 0;
}
程序只能在LINUX或UNIX下才编译
xlC main.cpp -lpthread