• 封装个简单的自动锁


    #pragma once

    //锁接口
    class ILock 

    public
        virtual ~ILock() {} 
        virtual void Lock() = 0
        virtual void Unlock() = 0
    }; 

    /************************************************************************/
    /*        CRITICAL_SECTION                                              */
    /************************************************************************/
    class CriticalSectionLocker 
        : ILock
    {  
    public
        inline CriticalSectionLocker(void)
        {
            InitializeCriticalSection(&m_hCriticalSection); 
        }

        inline virtual ~CriticalSectionLocker(void)
        {
            DeleteCriticalSection(&m_hCriticalSection); 
        }

        inline virtual void Lock()
        {
            EnterCriticalSection(&m_hCriticalSection);
        }

        inline virtual void Unlock()
        {
            LeaveCriticalSection(&m_hCriticalSection); 
        }
    private:
        CRITICAL_SECTION m_hCriticalSection;
    }; 

    /************************************************************************/
    /* Mutex                                                                */
    /************************************************************************/

    //互斥对象锁类 

    class MutexLocker
        : public ILock 

    public
        MutexLocker()
        {
            m_mutex = ::CreateMutex(NULL, FALSE, NULL); 
        }

        ~MutexLocker()
        {
            ::CloseHandle(m_mutex);
        }

        inline virtual void Lock()
        {
            DWORD d = WaitForSingleObject(m_mutex, INFINITE);
        }

        inline virtual void Unlock()
        {
            ::ReleaseMutex(m_mutex);
        }

    private
        HANDLE m_mutex; 
    }; 

    /************************************************************************/
    /* 自动锁                                                                     */
    /************************************************************************/
    template <typename LockTyp>
    class AutoLock 

        LockTyp* m_pLock; 
    public
        AutoLock(LockTyp& locker) 
        { 
            m_pLock = &locker; 
            m_pLock->Lock(); 
        } 

        AutoLock(LockTyp* locker) 
        { 
            m_pLock = locker; 
            m_pLock->Lock(); 
        } 

        ~AutoLock(void
        { 
            m_pLock->Unlock(); 
        } 
    }; 
  • 相关阅读:
    Ellipsis 的升级版 line-clamp
    Angular7里面实现 debounce search
    闭包、迭代器
    Day10 函数的进阶
    函数
    文件的操作
    Day 07基础数据补充、set、深浅拷贝
    小数据池,编码和解码
    字典
    列表、元祖的操作
  • 原文地址:https://www.cnblogs.com/kenter/p/2295742.html
Copyright © 2020-2023  润新知