c++ poco Mutex相关 源码剖析

本文详细剖析了C++ Poco库中Mutex和FastMutex的实现,包括构造、析构、lock、tryLock及unlock等关键函数。Mutex是递归互斥锁,允许同一线程多次锁定,而FastMutex是非递归的,重复锁定会导致死锁。两者都使用了pthread库的相关系统调用来实现锁机制。
摘要由CSDN通过智能技术生成

1.概述

  锁机制是多线程并发情景下一种控制共享资源访问的同步机制。Mutex与FastMutex相似,它们都可以借助ScopedLock模板类来自动地对互斥量进行上锁和解锁。不同的是,Mutex是递归的,这意味着同一个互斥量允许被同一个线程锁定多次;FastMutex是非递归的,这意味着如果同一个线程尝试再次锁定一个已经被锁定的互斥量,将会出现死锁的现象。

2.类图

这里写图片描述
2.1)Mutex私有继承于MutexImpl,类内包含模板参数为Mutex的ScopedLock类声明。
2.2)FastMutex私有继承于FastMutexImpl,类内包含模板参数为FastMutex的ScopedLock类声明,FastMutexImpl公有继承于MutexImpl。
2.3)MutexImpl类封装了linux互斥锁相关的系统调用。
2.4)ScopedLock模板类的析构和构造函数对传入“锁对象”进行上锁和解锁操作。

3.接口解析

template <class M>
class ScopedLock
    /// A class that simplifies thread synchronization
    /// with a mutex.
    /// The constructor accepts a Mutex (and optionally
    /// a timeout value in milliseconds) and locks it.
    /// The destructor unlocks the mutex.
{
public:
    explicit ScopedLock(M& mutex): _mutex(mutex)
    {
        _mutex.lock();
    }

    ScopedLock(M& mutex, long milliseconds): _mutex(mutex)
    {
        _mutex.lock(milliseconds);
    }

    ~ScopedLock()
    {
        try
        {
            _mutex.unlock();
        }
        catch (...)
        {
            poco_unexpected();
        }
    }

private:
    M& _mutex;

    ScopedLock();
    ScopedLock(const ScopedLock&);
    ScopedLock& operator = (const ScopedLock&);
};

3.1Mutex

3.1.1构造函数
Mutex::Mutex()
{
}
MutexImpl::MutexImpl()
{
#if defined(POCO_VXWORKS)
    /// ... ...
#endif
    pthread_mutexattr_t attr;
    pthread_mutexattr_init(&attr);
#if defined(PTHREAD_MUTEX_RECURSIVE_NP)
    /// ... ...
#elif !defined(POCO_VXWORKS) 
    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
#endif
    if (pthread_mutex_init(&_mutex, &attr))
    {
        pthread_mutexattr_destroy(&attr);
        throw SystemException(
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值