最近,简单整理完Linux线程方面的知识点,突发奇想的想写个线程池来玩玩。经过多方的考虑,决定仿java的线程池来写。由于没有学过java,最后的结果可能差距很大,好像扯远了回到正题来。Java线程池中使用到了BlockingQueue类那就先来试着用C++来实现它吧!
最终只实现了BlockingQueue中的ArrayBlockingQueue(基于数组的阻塞队列实现)和LinkedBlockingQueue(基于链表的阻塞队列)也只实现了BlockingQueue中4个核心的方法。好像对线程池来说够用了。
1.Mutext.h
#ifndef __MUTEX_H__
#define __MUTEX_H__
#include <pthread.h>
class CMutexLock
{
public:
explicit CMutexLock()
{
pthread_mutex_init(&m_Mutex, NULL);
}
~CMutexLock()
{
pthread_mutex_destroy(&m_Mutex);
}
void lock()
{
pthread_mutex_lock(&m_Mutex);
}
void unlock()
{
pthread_mutex_unlock(&m_Mutex);
}
pthread_mutex_t *get()
{
return &m_Mutex;
}
private:
friend class CCondition;
pthread_mutex_t m_Mutex;
};
class CMutexLockPart
{
public:
explicit CMutexLockPart(CMutexLock &MutexLock)
:m_MutexLock(MutexLock)
{
m_MutexLock.lock();
}
~CMutexLockPart()
{
m_MutexLock.unlock();
}
private:
CMutexLock &m_MutexLock;
};
#endif //#ifndef __MUTEX_H__
2.Condition.h
#ifndef __CONDITION_H__
#define __CONDITION_H__
#include "Mutex.h"
class CCondition
{
public:
explicit CCondition(CMutexLock &MutexLock)
:m_MutexLock(MutexLock)
{
pthread_cond_init(&m_Condition, NULL);
}
~CCondition()
{
pthread_cond_destroy(&m_Condition);
}
void wait()
{
pthread_cond_wait(&m_Condition, m_MutexLock.get());
}
void signal()
{
pthread_cond_signal(&m_Condition);
}
void broadcast()
{
pthread_cond_broadcast(&m_Condition);
}
private:
CMutexLock &m_MutexLock;
pthread_cond_t m_Cond