• C++:互斥量C++实现,内存调试,自动锁


    /*互斥量C++实现+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    class CMutex
    {
    public:
        CMutex() ;
        ~CMutex() ;
    
        void lock() ;
        void unlock() ;
    
    private:
    
    #ifdef _WIN32
        CRITICAL_SECTION cs;
    #else
        pthread_mutex_t cs;
        pthread_mutexattr_t mta ;
    #endif
    };
    
    #ifdef _WIN32
    CMutex::CMutex()
    {
        InitializeCriticalSection(&cs);
    }
    
    CMutex::~CMutex()
    {
        DeleteCriticalSection(&cs);
    }
    
    void CMutex::lock()
    {
        EnterCriticalSection(&cs);
    }
    
    void CMutex::unlock()
    {
        LeaveCriticalSection(&cs);
    }
    #else
    CMutex::CMutex()
    {
        pthread_mutexattr_init( &mta ) ;
        pthread_mutexattr_settype( &mta , PTHREAD_MUTEX_RECURSIVE_NP ) ;
        pthread_mutex_init( &cs , &mta ) ;
    }
    
    CMutex::~CMutex()
    {
        pthread_mutexattr_destroy( &mta ) ;
        pthread_mutex_destroy(&cs);
    }
    
    void CMutex::lock()
    {
        //printf( " lock the %d 
    " , &cs ) ;
        pthread_mutex_lock(&cs);
    }
    
    void CMutex::unlock()
    {
        //printf( " unlock the %d 
    " , &cs ) ;
        pthread_mutex_unlock(&cs);
    }
    #endif
    
    /* 例一 内存调试+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    //如果定义了内存调试宏
    #ifdef DEBUG_MALLOC
    CMutex    mallocMutex ;
    int        malloctick = 0 ;
    
    //-----------------------------------------------
    //对内存分配增加一个计数器,用于调试内存泄露
    void *debugMalloc( int size )
    {
        void *pmem = 0 ;
        mallocMutex.lock() ;
    
        //malloc次数+1
        malloctick ++ ;
        pmem = malloc( size ) ;
    
        printf( "debugMalloc count = %d
    " , malloctick ) ;
    
        mallocMutex.unlock() ;
    
        return pmem ;
    }
    
    //-----------------------------------------------
    //用于调试内存泄露
    void    debugFree( void *pmem )
    {
        mallocMutex.lock() ;
        //malloc次数-1
        malloctick -- ;
        free( pmem ) ;
        printf( "debugFree count = %d
    " , malloctick ) ;
        mallocMutex.unlock() ;
    }
    #endif    //DEBUG_MALLOC
    
    /* 例二 自动锁+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*自动锁作用在一个局部,在函数内部,从声明该锁开始,到函数退出时,销毁自动锁时,在析构函数里面调用CMutex::unlock()*/
    class CAutoMutex
    {
    public:
        CAutoMutex( CMutex *mutex )
        {
            m_pmutex = mutex ;
            if( m_pmutex )
                m_pmutex->lock() ;
        }
    
        virtual ~CAutoMutex()
        {
            if( m_pmutex )
            {
                m_pmutex->unlock() ;
                m_pmutex = NULL ;
            }
        };
    private:
        CMutex                *m_pmutex ;
    };
    
    //一个使用自动锁的类
    class CNetServer
    {
    protected:
        CNetServer() ;
        ~CNetServer() ;
        DECLARE_SINGLEOBJ( CNetServer )
    publicbool            RequestTalkOn( unsigned userid );
    protected:
        //对讲标志状态
        bool            m_talkOn ;
        int                m_talkUserID ;
        CMutex            m_taklMutex ;
    };
    
    //使用示例
    bool CNetServer::RequestTalkOn( unsigned userid )
    {
        CAutoMutex atlck( &m_taklMutex);
        m_talkUserID = userid ;
        m_talkOn = true ;
        NETLIB_PRINTF("request Talkon success userid = %d
    " , userid ) ;
        return true ;
    }
    /*THE END, ocj*/
  • 相关阅读:
    Vim的分屏功能 | 酷壳 CoolShell.cn
    分享:Hadoop的Python框架指南
    KMP算法之另类图示分析
    C#cookie自动获取工具发布
    tmux Tutorial Split Terminal Windows Easily
    爱上MVC3~将系统的路由设置抽象成对象吧
    DDD~microsoft NLayerApp项目中的层次结构图
    不说技术~难得糊涂
    DDD~基础设施层
    基础才是重中之重~开发人员应用学会用throw
  • 原文地址:https://www.cnblogs.com/mylinux/p/5279871.html
Copyright © 2020-2023  润新知