临界区访问的两个类:临界区类,共享临界区类——多平台版本

/******************************************************** 
    * @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

 

转载于:https://www.cnblogs.com/eaglexmw/p/11281319.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值