////// @file Lock.h/// @brief/// @author guozhiming/// @date 2007-04-11///#ifndef __LOCK__#define __LOCK__#include "def.h"//定义了信号量锁,还有读写锁;话说我用qt开发,这些锁qt里面都有。可以直接拿来用了/// @brief 锁的基本操作   1:读操作的时候读锁可以并发 2:写操作的时候,独占操作class G_Lock{    public:                                                          /// @brief 构造函数初始化互斥锁 , 条件变量        G_Lock();        /// @brief 析构函数释放互斥锁,和条件变量        ~G_Lock();        /// @brief 读锁 readCounter++ , 锁住readCounter        void rLock();        /// @brief 解锁 readCounter-- , 如果readCounter = 0 , pthread_cond_signal通知        void unrLock();        /// @brief 写锁 如果readCounter不为0一直 pthread_cond_wait等待下去        void wLock();        /// @brief 解锁        void unwLock();                                                  private:        pthread_mutex_t r_Mutex;     ///读锁 ,锁住readCounter        pthread_mutex_t w_Mutex;     ///锁住同步资源                                                          unsigned long readCounter;             ///条件变量如果为0通知(pthread_cond_signal)        pthread_cond_t condReadCounter;};#endif

////// @file Lock.cpp/// @brief/// @author guozhiming/// @date 2007-04-11//现在是2013年,这家伙07年就写得这代码,我现在看,是否落后呢?///#include "Lock.h"G_Lock::G_Lock(){    pthread_mutex_init(&r_Mutex , NULL);    pthread_mutex_init(&w_Mutex , NULL);    pthread_cond_init(&condReadCounter , NULL);    readCounter = 0;}G_Lock::~G_Lock(){    pthread_mutex_destroy(&r_Mutex);    pthread_mutex_destroy(&w_Mutex);    pthread_cond_destroy(&condReadCounter);}void G_Lock::rLock(){//读写都是配套出现的,没有现成的c库吗?要自己写。读的时候不许写,读靠一个信号量,最大允许多少人同时读。。。    pthread_mutex_lock(&w_Mutex);   //防止于写操作冲突    pthread_mutex_lock(&r_Mutex);   //防止readCounter 冲突    readCounter++;  //只是为了++这个,上面2句下面2句    pthread_mutex_unlock(&w_Mutex);     ///写解锁    pthread_mutex_unlock(&r_Mutex);     ///读解锁//先上锁一遍,再解锁??记得有个try_lock!!!???}//什么意思都是先加锁,再解锁。。。void G_Lock::unrLock(){    pthread_mutex_lock(&r_Mutex);      ///读加锁    readCounter--;    if(0 == readCounter)    {//pthread_cond_t condReadCounter;这样定义的,这也叫信号。。。这个机制还不清楚,一般都用封装好的c++类。。        pthread_cond_signal(&condReadCounter);    //如果readCounter为0 , 表示已经没有读了,可以写    }    pthread_mutex_unlock(&r_Mutex);     ///读解锁}//又是先加锁再解锁。。。void G_Lock::wLock(){    pthread_mutex_lock(&w_Mutex);   ///写加锁    pthread_mutex_lock(&r_Mutex);   ///读加锁    if(0 == readCounter)   ///防止readCounter = 0而且没有调用过rLock()和unrLock()    {        pthread_mutex_unlock(&r_Mutex);    ///读解锁        return ;    }//这是对应上面的那个signal吗?    pthread_cond_wait(&condReadCounter , &r_Mutex);         //等待readCounter = 0 , 等待期间r_Mutex被解锁,有信号再加锁    pthread_mutex_unlock(&r_Mutex);       ///读解锁}//这个直接解锁,终于明白了void G_Lock::unwLock(){    pthread_mutex_unlock(&w_Mutex);         //写解锁}

////// @file def.h/// @brief/// @author guozhiming/// @date 2007-04-11///#ifndef __DEF__#define __DEF__#include 
#include
#include
#include
#include
#include
#include
#include
//哦。有标准的queue,竟然还自己写个。#include
#include
#include
#include
#include
#include
#include
//标准c++using namespace std;typedef unsigned long ULONG;/// @brief 为了服务器接收到client的信息把数据和client的套接字连接到一起struct G_DataSocket{ int nSocket; void *pStr;};#endif

////// @file ListenThread.h/// @brief 服务器监听线程/// @author guozhiming/// @date 2007-05-16///#ifndef __G_LISTENTHREAD__#define __G_LISTENTHREAD__#include "Thread.h"#include "Socket.h"#include "ThreadPool.h"class G_ThreadPool;  //线程池。。class G_ListenThread : public G_Thread //还有个基类{    public:        /// @brief 构造函数        G_ListenThread(G_ThreadPool *pool);        /// @brief 析构函数        virtual ~G_ListenThread();        /// @brief        void Run();   //哦。都是一个run,和qt的线程模式一样。        /// @brief 服务器帮定端口        ///        /// @param nPort 帮定端口        ///        /// @return true表示成功 , false表示失败        bool Bind(unsigned int nPort);    private:                       ///套接口操作的对象        G_Socket *g_socket;        G_ThreadPool *g_threadPool;};#endif

#include "ListenThread.h"#include "Log.h"G_ListenThread::G_ListenThread(G_ThreadPool *pool) : g_threadPool(pool){    g_socket = new G_Socket();}G_ListenThread::~G_ListenThread(){    if(g_socket)    {        delete g_socket;        g_socket = NULL;    }}void G_ListenThread::Run(){    pause();//看不懂,暂停,,什么时候开始。?有信号时,会中断此函数。什么信号,什么时候来?    debug_output("Listen thread is starting ....\n");          int nSocket;    while(1)    {        if(g_socket->Listen(nSocket))        {            debug_output("new client is connecting ....\n");//新的连接?那socket是客户端的socket??            g_threadPool->pushSocket(nSocket);   ///填加到套接口队列//这里放的是server的socket啊??            g_threadPool->continues();   ///通知线程池,运行起来,到套接口队列中取套接口        }    }}bool G_ListenThread::Bind(unsigned int nPort){    if(!g_socket->Bind(nPort))    {        debug_output("Bind port %d is faild\n" , nPort);        return false;    }    debug_output("Bind port %d is Successful\n" , nPort);    continues();    return true;}