线程锁

作者: 游学者夏纳 | 来源:发表于2023-03-02 14:31 被阅读0次

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

#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
    ...
}

相关文章

  • 4.0.6.守护线程,线程死锁

    守护线程会随着主线程的结束而结束DaemonThread 线程 1, 线程 2,锁1,锁2 线程1 有锁1,想拿锁...

  • 悲观锁:一个线程得到锁,其它线程挂起,synchronized 乐观锁:一个线程得到锁,其它线程不断重试, cas...

  • sleep,wait, join yield

    锁池:所有需要竞争同步锁的线程都会放在锁池中,当一个线程得到锁后,其他线程都会在锁池中等待,当线程释放锁之后,其他...

  • 并发编程-线程

    线程 GIL 守护线程 线程锁(互斥锁 and 递归锁) 信号量 事件 条件 定时器 1.线程: 特点在多线程的操...

  • 深入理解AQS(二)- 共享模式

    共享锁与独占锁 独占锁被某个线程持有时,其他线程只能等待当前线程释放后才能去竞争锁,而且只有一个线程能竞争锁成功。...

  • iOS中各种锁的性能对比

    自旋锁 与 互斥锁 自旋锁 (spin lock): 如果一个线程需要获取自旋锁,该锁已经被其他线程占用,该线程不...

  • 死锁

    什么是死锁 简单的说:线程1持有A锁,线程2持有B锁;线程1尝试获取B锁,线程2尝试获取A锁。两个线程各持有了一把...

  • 公平锁和非公平锁-ReentrantLock是如何实现公平、非公

    1、什么是公平锁与非公平锁 公平锁:公平锁就是保障了多线程下各线程获取锁的顺序,先到的线程优先获取锁。非公平锁:非...

  • 2020-03-11 公平锁与非公平锁

    补: 公平锁:多个线程情况下排队,先到先获得锁 非公平锁:当锁被释放后,所有线程竞争锁,抢到的线程就会获得锁 非公...

  • LINUX线程

    创建线程 启动线程 线程锁

网友评论

      本文标题:线程锁

      本文链接:https://www.haomeiwen.com/subject/woyjldtx.html