关于单例模式这里不再多说了,网上很多例子。这里实现一个很通用的,线程安全的单例类,具体应用场景如:线程池的任务队列,epoll事件框架类等。
#define DISABLE_COPY_AND_ASSIGN(T) \
T(const T &); \
T& operator=(const T &)
struct Recursive {};
class Mutex {
public:
Mutex() {
pthread_mutex_init(&_mutex, NULL);
}
explicit Mutex(Recursive) {
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
pthread_mutex_init(&_mutex, &attr);
pthread_mutexattr_destroy(&attr);
}
~Mutex() {
pthread_mutex_destroy(&_mutex);
}
int lock() {
return pthread_mutex_lock(&_mutex);
}
int trylock() {
return pthread_mutex_trylock(&_mutex);
}
int unlock() {
return pthread_mutex_unlock(&_mutex);
}
private:
pthread_mutex_t _mutex;
// RAII class should not be able to be copied
DISABLE_COPY_AND_ASSIGN(Mutex);
};
template <class T>
class AutoLock {
public:
explicit AutoLock(T* t) : _t(t) {
_t.lock();
}
~AutoLock() {
_t.unlock();
}
private:
T* _t;
// RAII class should not be able to be copied
DISABLE_COPY_AND_ASSIGN(AutoLock);
};
class Queue {
public:
static Queue& instance() {
static Queue instance; // it's only construct once when using Queue::instance()
return instance;
}
Request* fetch() {
AutoLock<Mutex> autolock(&_lock);
//TODO
}
void add(Item* ite_) {
AutoLock<Mutex> autolock(&_lock);
//TODO
}
private:
Queue();
~Queue();
Mutex _lock;
DISABLE_COPY_AND_ASSIGN(Queue);
};
// using method
void foo (void)
{
Queue::instance().fetch();
... ...
Queue::instance().add(...);
}