《C/C++ 面试 100 例》(十六)自动锁

本文介绍了多线程编程中的锁概念,重点讲解了C++中如何利用CRITICAL_SECTION实现普通锁和自动锁。自动锁通过构造和析构函数自动完成加锁和解锁操作,简化了代码中的同步逻辑。示例展示了如何在main函数中使用NLock和AutoLock进行线程安全的代码执行。

一、锁

  • 锁 是 多线程编程 中一个很常用的概念,这里不多加介绍其原理,有兴趣可以参考 临界区 进行更多的了解;
  • 锁 一般会提供三个接口:加锁(Lock)、解锁(UnLock)、尝试加锁(TryLock);
  • 本文将利用 C++ 的 构造函数 和 析构函数,把 加锁 和 解锁 在一行代码中实现;

二、自动锁

1、普通锁实现

  • 这里利用 CRITICAL_SECTION 相关的接口实现了一系列普通锁的接口封装;
class ILock
{
public:
    ILock(){}
    virtual ~ILock(){}
    virtual void Lock(void) = 0;
    virtual bool TryLock(void) = 0;
    virtual void UnLock(void) = 0;
};

class NLock : public ILock
{
public:
    NLock (){
        InitializeCriticalSection(&m_kSection);
    }
    virtual ~NLock (){
        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;
};

2、自动锁实现

  • 1)构造函数:接收传入的 锁指针,并且存成成员变量;
  • 2)析构函数:对成员变量的锁执行解锁操作;
class AutoLock   // 注意:这里不继承 ILock
{
public:
    AutoLock(ILock *pkLock) {
        m_pkLock = pkLock;
        m_pkLock->Lock();
    }
    ~AutoLock() {
        m_pkLock->UnLock();
    }
protected:
    ILock*	m_pkLock;
};

3、自动锁使用

int main() {
	NLock m_kLock;
	{
		AutoLock kAutoLock(&m_kLock);   // 1)构造函数中执行 m_kLock 的加锁
		// 执行对应加锁后的操作
	}
	// 2)退出 kAutoLock 作用域,自动调用析构,执行 m_kLock 解锁
	return 0;
}

  • 1)构造函数中执行 m_kLock 的加锁;
  • 2)退出 kAutoLock 作用域,自动调用析构,执行 m_kLock 解锁;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄哪里出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值