多线程的内存池是基于模板的类:
- template <typename POOLTYPE,typename LOCK>
- class MTMemoryPool
- {
- public:
- void* alloc(size_t size);
- void free(void* someElement);
- private:
- POOLTYPE stPool;
- LOCK theLock;
- };
- template <typename M,typename L>
- void* MTMemoryPool<M,L>::alloc(size_t size)
- {
- void *mem;
- theLock.lock();
- mem=stPool.alloc(size);
- theLock.unlock();
- return mem;
- }
- template <typename M,typename L>
- void MTMemoryPool<M,L>::free(void* doomed)
- {
- theLock.lock();
- stPool.free(doomed);
- theLock.unlock();
- }
第一个模板参数是指定的适用于单线程的内存池。要求实现alloc和free接口。
第二个参数是采用的锁的类。要求实现lock和unlock接口。
此模板类也可以适用于单线程的情况,只要实现一个锁类,其lock和unlock什么都不做。
使用此线程池的类:
- #include "ByteMemoryPool.h"
- #include "MutexLock.h"
- class Rational
- {
- public:
- Rational(int a=0,int b=1):n(a),d(b) {}
- void *operator new(size_t size)
- {
- return memPool->alloc(size);
- }
- void operator delete(void* doomed,size_t size)
- {
- memPool->free(doomed);
- }
- static void newMemPool() {memPool=new MTMemoryPool<ByteMemoryPool,MutexLock>;}
- static void deleteMemPool() {delete memPool;}
- private:
- int n;
- int d;
- static MTMemoryPool<ByteMemoryPool,MutexLock>* memPool;
- };
- MTMemoryPool<ByteMemoryPool,MutexLock>* Rational::memPool=nullptr;
测试代码同前两篇单线程的情况。
其中MutexLock类的实现如下:
抽象基类:
- class ABCLock
- {
- public:
- virtual ~ABCLock()=0;
- virtual void lock()=0;
- virtual void unlock()=0;
- };
MutexLock类:
- #include "ABCLock.h"
- #include <pthread.h>
- class MutexLock:public ABCLock
- {
- public:
- MutexLock()
- {
- pthread_mutex_init(&mutex,NULL);
- }
- ~MutexLock()
- {
- pthread_mutex_destroy(&mutex);
- }
- void lock()
- {
- pthread_mutex_lock(&mutex);
- }
- void unlock()
- {
- pthread_mutex_unlock(&mutex);
- }
- private:
- pthread_mutex_t mutex;
- };
考虑继续扩充控制线程同步的类。