线程锁

好的源码胜过千教万学……

#pragma once
#include "EsPrerequisites.h"


namespace Es
{

// 锁定义
class VirtualLock
{
public:
    VirtualLock(){}

    virtual ~VirtualLock(){}

    virtual void Lock(void) = 0;
    virtual bool TryLock(void) = 0;
    virtual void UnLock(void) = 0;
};

// 自动锁
class AutoLock
{
public:
    AutoLock(VirtualLock *pkLock)
    {
        m_pkLock = pkLock;
        m_pkLock->Lock();
    }

    ~AutoLock()
    {
        m_pkLock->UnLock();
    }

protected:
    VirtualLock*    m_pkLock;
};

#ifdef _WIN32
// 手动锁
class NormalLock : public VirtualLock
{
public:
    NormalLock()
    {
        InitializeCriticalSection(&m_kSection);
    }

    virtual ~NormalLock()
    {
        DeleteCriticalSection(&m_kSection);
    }

    virtual void Lock(void)
    {
        EnterCriticalSection(&m_kSection);
    }

    virtual bool TryLock(void)
    {
        return (TryEnterCriticalSection(&m_kSection) > 0);
    }

    virtual void UnLock(void)
    {
        LeaveCriticalSection(&m_kSection);
    }

protected:
    CRITICAL_SECTION m_kSection;
};

#else 
#if defined( _VISION_IOS) || defined(_VISION_ANDROID)
// 手动锁
class NormalLock : public VirtualLock
{
public:
    NormalLock()
    {
        pthread_mutexattr_t kAttr;
        pthread_mutexattr_init(&kAttr);
        pthread_mutexattr_settype(&kAttr, PTHREAD_MUTEX_RECURSIVE);
        pthread_mutex_init(&m_kMutex,&kAttr);

    }

    virtual ~NormalLock()
    {
        pthread_mutex_destroy(&m_kMutex);

    }

    virtual void Lock(void)
    {
        pthread_mutex_lock(&m_kMutex);
    }

    virtual void UnLock(void)
    {
        pthread_mutex_unlock(&m_kMutex);
    }

    virtual bool TryLock(void)
    {
        return (pthread_mutex_trylock(&m_kMutex) != 0);
    }

protected:
    pthread_mutex_t  m_kMutex;
};

#else 

class NormalLock : public VirtualLock
{
public:
    NormalLock()
    {
        pthread_mutexattr_t kAttr;
        pthread_mutexattr_init(&kAttr);
        pthread_mutexattr_settype(&kAttr, PTHREAD_MUTEX_RECURSIVE_NP);
        pthread_mutex_init(&m_kMutex, &kAttr);

    }

    virtual ~NormalLock()
    {
        pthread_mutex_destroy(&m_kMutex);

    }

    virtual void Lock(void)
    {
        pthread_mutex_lock(&m_kMutex);
    }

    virtual void UnLock(void)
    {
        pthread_mutex_unlock(&m_kMutex);
    }

    virtual bool TryLock(void)
    {
        return (pthread_mutex_trylock(&m_kMutex) != 0);
    }

protected:
    pthread_mutex_t  m_kMutex;
};
#endif
#endif

} // namespace Es

使用例

// define
protected:
    Es::NormalLock          m_kGenIDLock;   

// use
...
{
    Es::AutoLock kLock(&m_kGenIDLock);
    // logic here
    ...
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容