CSingleLock

c++ 专栏收录该内容
13 篇文章 0 订阅

CSingleLock简介

CSingleLock没有基类。

一个CSingleLock类对象代表一种访问控制机制,这种机制用于控制在一个多线程程序中对一个资源的访问。为了使用同步类CSemaphore,CMutex,CCriticalSection,和CEvent,你必须创建一个CSingleLock或CMultiLock对象来等待和释放这个同步对象。当你只需要每次等待一个对象时,可以使用CSingleLock。当在一个特别的时候你可以使用多个对象时,可以使用CMultiLock。

要使用一个CSingleLock对象,在被控制资源的类中的一个成员函数内部调用CSingleLock的构造函数。然后调用ISLock成员函数来确定这个资源是否可用。如果资源是可用的,则继续该成员函数的其余部分。如果资源不能使用,可以在一个指定的时间内等待资源被释放,或者是返回失败。在使用完资源后,如果CSingleLock对象要被再次使用,可以调用Unlock函数,或者销毁CSingleLock对象。

CSingleLock对象需要有一个从CSyncObject派生的对象存在。这通常是一个被控制资源的类的数据成员。

使用CSingleLock通过对互斥的控制达到共享资源的互斥访问;如果一个线程占正在访问互斥,那么系统将挂起当前的调用线程,直到这个互斥被释放为止,这时,被挂起的线程将被唤醒并取得对互斥的控制;一般来说使用锁需要Lock,Unlock两步,而使用CSingleLock时,只需要一步即可,即在函数内部,声明一个CSingleLock,同时指定互斥对象的指针,在函数执行完毕的时候,会自动执行CSingleLock的析构函数,从而解锁。

优缺点

1.防止编程时的笔误,只有Lock,没有UnLock。
2.函数异常退出时,有可能流程走不到UnLock处,会导致资源锁死,而使CSingleLock,则会在函数出栈时,自动调用CSingleLock析构函数。
3.缺点就是性能上总会有损失的,因为它多了一个构造与析构的过程,但对于普通应用来讲,优处大于缺点。

代码

class CDataArray
{
private:
    int iArray[10];
    CMutex Mutex;
    CCriticalSection CritSection;
public:
    CDataArray(){};
    ~CDataArray(){};
 
    void SetData(int iValue);
    void GetDataArray(int aArray[10]);
};
 
void CDataArray::SetData(int iValue)
{
 CSingleLock SingleLock(&Mutex);//方法一
 //CSingleLock SingleLock(&CritSection); 方法二
 SingleLock.Lock();
 if(SingleLock.IsLocked()){
 for (int i=0;i<10;i++)
  iArray[i]=iValue;
 }
 Lock.Unlock();//此步也可以进行省略
}
 
void CDataArray::GetDataArray(int aArray[10])
{
 CSingleLock SingleLock(&Mutex);//方法一
 //CSingleLock SingleLock(&CritSection); 方法二
 SingleLock.Lock();
 if(SingleLock.IsLocked()){
 for (int i=0;i<10;i++)
  aArray[i]=iArray[i];
 }
 Lock.Unlock();//此步也可以进行省略
}

 

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Anatoleabc

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值