先顶层的,再具体功能的
良好的封装可以提升开发效率(线程安全的队列、线程、线程池)
服务器实现
线程安全队列
template<class T>
class TianChenQueue
{
public:
enum
{
TCNone,
TCPush,
TCPop,
TCSize,
TCClear,
};
typedef struct IocpParam
{
size_t nOperator;
T Data;
HANDLE hEvent;
IocpParam(int op, const T& data, HANDLE hEve = NULL) {
nOperator = op;
Data = data;
hEvent = hEve;
}
IocpParam() {
nOperator = TCNone;
}
}PARAM;
public:
TianChenQueue()
{
m_lock = false;
m_hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 1);
m_hTread = INVALID_HANDLE_VALUE;
if (m_hCompletionPort != NULL) {
m_hTread = (HANDLE)_beginthread(&TianChenQueue<T>::thradEntry, 0, this);
}
};
virtual ~TianChenQueue()
{
if (m_lock == true)return;
m_lock = true;
PostQueuedCompletionStatus(m_hCompletionPort, 0, NULL, NULL);
WaitForSingleObject(m_hTread, INFINITE);
if (m_hCompletionPort != NULL) {
HANDLE hTemp = m_hCompletionPort;
m_hCompletionPort = NULL;
CloseHandle(hTemp);
}
};
bool PushBack(const T& data){}
virtual bool PopFront(T& data) {}
size_t Size() {}
bool Clear() {
}
protected:
static void thradEntry(void* arg) {
}
virtual void DealParam(PARAM* pParam)
{}
virtual void threadMain()
{}
protected:
std::list<T> m_lstData;
HANDLE m_hCompletionPort;
HANDLE m_hTread;
std::atomic<bool> m_lock;
};
template<class T>
class TianchenSendQueue :public TianChenQueue<T>,public ThreadFuncBase
{
public:
typedef int (ThreadFuncBase::* TCCALLBACK)(T& data);
TianchenSendQueue(ThreadFuncBase* obj, TCCALLBACK callback)
:TianChenQueue<T>(), m_base(obj), m_callback(callback)
{
m_thread.Start();
m_thread.UpdateWorker(::ThreadWorker(this,(FUNCTYPE)&TianchenSendQueue<T>::threadTick));
}
virtual ~TianchenSendQueue()
{
m_base = NULL;
m_callback == NULL;
m_thread.Stop();
}
protected:
virtual bool PopFront(T& data) { return false; }
bool PopFront(){}
int threadTick(){}
virtual void DealParam(typename TianChenQueue<T>::PARAM* pParam)
{}
private:
ThreadFuncBase* m_base;
TCCALLBACK m_callback;
TianchenThread m_thread;
};
typedef TianchenSendQueue<std::vector<char>>::TCCALLBACK SENDCALLBACK;
线程池
class ThreadFuncBase {};
typedef int (ThreadFuncBase::* FUNCTYPE)();
class ThreadWorker
{
public:
ThreadWorker() :thiz(NULL), func(NULL) {}
ThreadWorker(void* obj, FUNCTYPE f) :thiz((ThreadFuncBase*)obj), func(f) {}
ThreadWorker(const ThreadWorker& worker)
{
thiz = worker.thiz;
func = worker.func;
}
ThreadWorker& operator=(const ThreadWorker& worker)
{
if (this != &worker)
{
thiz = worker.thiz;
func = worker.func;
}
return *this;
}
int operator()()
{
if (IsValid()) {
return (thiz->*func)();
}
return -1;
}
bool IsValid()const
{
return (thiz != NULL) && (func != NULL);
}
private:
ThreadFuncBase* thiz;
FUNCTYPE func;
};
class TianchenThread
{
public:
TianchenThread() {
m_hThread = NULL;
m_bStatus = false;
}
~TianchenThread() {
Stop();
}
bool Start()
;
bool Stop();
bool IsValid() {
if (m_hThread == NULL || (m_hThread == INVALID_HANDLE_VALUE))return false;
return WaitForSingleObject(m_hThread, 0) == WAIT_TIMEOUT;
}
void UpdateWorker(const ::ThreadWorker& worker = ::ThreadWorker())
;
bool IsIdle()
;
private:
void ThreadWorker();
static void ThreadEntry(void* arg);
private:
HANDLE m_hThread;
bool m_bStatus;
std::atomic<::ThreadWorker*>m_worker;
};
class TianchenThreadPool
{
public:
TianchenThreadPool(size_t size);
TianchenThreadPool() {}
~TianchenThreadPool(){}
;
bool Invoke() {}
void Stop(){}
int DispatchWorker(const ThreadWorker& worker)
;
bool CheckThreadVaild(size_t index) ;
private:
std::mutex m_lock;
std::vector<TianchenThread*>m_threads;
};
服务器接收
class RTSPServer: public ThreadFuncBase
{
public:
RTSPServer() :m_socket(true), m_status(0),m_pool(10)
{
m_threadMain.UpdateWorker(::ThreadWorker(this, (FUNCTYPE)&RTSPServer::threadWorker));
}
~RTSPServer();
int Init(const std::string& strIp = "0.0.0.0", short port = 554);
int Invoke();
void Stop();
protected:
int threadWorker();
RTSPRequest AnalyseRequest(const std::string&data);
RTSPReply MakeReplay(const RTSPRequest& request);
int ThreadSession();
private:
ESocket m_socket;
TAddress m_addr;
int m_status;
TianchenThread m_threadMain;
TianchenThreadPool m_pool;
std::map<std::string, RTSPSession>m_mapSessions;
static SocketIniter m_initer;
TianChenQueue<ESocket>m_clients;
};
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c1510039af37f00d2c72883b6aa12b8d.png)