这只是一个线程池的框架还有许多不足 : 没有实现server->client数据发送 , 还有许多细节没有完善。
Lock.cpp : 锁的操作 , 读锁可以并发 , 写锁独占.
Queue.h : 队列的封装 , 队列的读和写都加了锁的保护.
Socket.cpp : 套接口的简单封装.
Thread.cpp : 线程的封装实现了些简单的线程停止,运行等功能 , 启动别的线程的时候需要继承次类.
Worker.cpp : 用户接口类 , 用户需继承此类。
ListenThread.cpp(继承Thread.cpp) : 服务器监听线程.如果有客户端连接通知ThreadPool类,由ThreadPool类进行任务分派.
TaskThread.cpp(继承Thread.cpp) : 具体任务类,负责接受客户端发送数据.
ThreadPool.cpp (继承Thread.cpp) : 线程池类负责启动别的线程 , 并且进行线程调度。首先启动ListenThread.cpp类,如果有客户端
连接ListenThread.cpp类发送信号通知ThreadPool.cpp类,收到信号再分配给TaskThread.cpp类,进行处理。如果没有空闲任务类,动态再
创建一定数目的任务类。
#ifndef __USERWORKER__ #define __USERWORKER__ #include "Worker.h" #include "Log.h" #include "def.h" #include "Server.h" struct UserData { int age; char name[20]; }; class UserWorker : public G_Worker { public: UserWorker(unsigned int num) : G_Worker(num) { } ~UserWorker() { } void recvMessage(void *str , int nSocket) { // struct UserData *userData = (struct UserData*)str; // std::cout<<"userData->age = "<<userData->age<<std::endl; sendMessage(nSocket , str); //sleep(2); } }; class MainPro : public G_Server { public: MainPro() { // userWork = new UserWorker(3); // userWork->Bind(9999); } ~MainPro() { /* if(userWork) { delete userWork; userWork = NULL; } */ } static MainPro *getInstance() { if(!instance) { instance = new MainPro(); } return instance; } void delInstance() { if(instance) { delete instance; instance = NULL; } } bool init(); private: UserWorker *userWork; static MainPro *instance; }; #endif
#include "testPool.h" MainPro *MainPro::instance = NULL; bool MainPro::init() { G_Server::init(); } int main() { MainPro *mp = MainPro::getInstance(); mp->init(); //看了一遍,整个结构,没感觉出来清晰的感觉。。 sleep(-1); //mp->delInstance(); //delete mp; //mp = NULL; //mp.init(); }
#ifndef __LOG__ #define __LOG__ #include "def.h" void debug_output(const char *fmt , ...); #endif
#include "Log.h" void debug_output(const char *fmt , ...) { /* time_t ti; ti = time(NULL); char times[65535]; snprintf(times , sizeof(times) , "%s" , ctime(&ti)); times[strlen(times)-1] = ' '; strncat(times , "----------- " , 9); */ va_list ap; char buff[65535]; va_start(ap , fmt); vsnprintf(buff , sizeof(buff) , fmt , ap); std::cout<<buff; //strncat(times , buff , strlen(buff)); //fwrite(times , sizeof(char) , strlen(times) , pt); //fwrite("\n" , 1 , 1 , pt); //fflush(pt); va_end(ap); }
log也没写到文件里等,半成品。。。
总结,没啥优点,这个模型,感觉不是很好。。。