zoukankan      html  css  js  c++  java
  • 临界区访问的两个类:临界区类,共享临界区类——多平台版本

    /******************************************************** 
        * @file    : Mutex.h
        * @desc    : 同步对象
        * @author  : 
        * @date    : 2019-7-30
        * @version : 1.0.0
    *********************************************************/
    
    #ifndef UTILITY_MUTEX_H_
    #define UTILITY_MUTEX_H_
    #include "UtilityDef.h"
    
    #ifdef WIN32
    typedef CRITICAL_SECTION thread_mutex;
    #else
    typedef pthread_mutex_t  thread_mutex;
    #endif
    
    class UTILITY_API CThreadMutex final {
    public:
        CThreadMutex() {
    #ifdef WIN32
            InitializeCriticalSection(&mutex_);
    #else
            pthread_mutex_init(&mutex_, nullptr);
    #endif
    
        }
    
        ~CThreadMutex(){
    #ifdef WIN32
            DeleteCriticalSection(&mutex_);
    #else
            pthread_mutex_destroy(&mutex_);
    #endif
        }
    
        void lock() {
            is_lock_ = true;
    #ifdef WIN32
            EnterCriticalSection(&mutex_);
    #else
            pthread_mutex_lock(&mutex);
    #endif
        }
    
        void unlock(){
            is_lock_ = false;
    #ifdef WIN32
            LeaveCriticalSection(&mutex_);
    #else
            pthread_mutex_unlock(&mutex_);
    #endif
    
        }
    
        bool islock()const {
            return is_lock_;
        }
    
        thread_mutex* get(){
            return &mutex_;
        }
    private:
        thread_mutex mutex_;
        volatile bool is_lock_;
    };
    
    
    
    class UTILITY_API CAutoThreadMutex final {
    public:
        explicit CAutoThreadMutex(CThreadMutex* mutex_ptr): mutex_(mutex_ptr) {
            lock();
        }
    
        ~CAutoThreadMutex() {
            unlock();
        }
    
        void lock() {
            if(mutex_){
                mutex_->lock();
            }
        }
    
        void unlock() {
            if(mutex_ && mutex_->islock()) {
                mutex_->unlock();
            }
        }
    
        thread_mutex* get() {
            return mutex_->get();
        } 
    
    protected:
        CAutoThreadMutex(const CAutoThreadMutex& rhs) {
            mutex_ = rhs.mutex_;
            lock();
        }
    
        CAutoThreadMutex& operator=(const CAutoThreadMutex& rhs){
            if(this == &rhs){
                return *this;
            }
    
            mutex_ = rhs.mutex_;
    
            return *this;
        }
    
    private:
        CThreadMutex* mutex_;
    };
    #endif
  • 相关阅读:
    Web前端学习笔记之BootStrap
    js 闭包解决方案
    函数节流简要解析
    js 观察者模式
    arguments解析
    js 职责链模式简要介绍
    js 工厂模式简要介绍
    jsonp跨域总结
    算法复杂度
    正则表达式的$
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/11281319.html
Copyright © 2011-2022 走看看