多线程中有关线程锁的简化应用。

      在网上无意间看到了一个关于C++的用临界区解决线程同步的方案,感觉作者设计的很巧妙。于是转成delphi代码:

      先看作者的设计方法:

    

class CLock 
{ 
private: 
        CRITICAL_SECTION m_section; 
public: 
        CLock(void) 
        { 
                InitializeCriticalSection(&m_section); 
        } 
        ~CLock(void) 
        { 
                DeleteCriticalSection(&m_section); 
 
        } 
        void lock() 
        { 
                EnterCriticalSection(&m_section); 
 
        } 
        void unLock() 
        { 
                LeaveCriticalSection(&m_section); 
        } 
};  

你可以这样使用:

CLock  lock;
void test()
{
    lock.lock();
   // do something.....
   lock.unlock();
}

如果忘记使用unlock来解锁的话,就会导致死锁。

分析可知道  在函数返回的时候必须要解锁  所以如果能监听到函数返回就好了

高手们提供了下面的辅助类:

class CAutoLock 
{ 
private: 
        CLock * m_pLock; 
public: 
        CAutoLock(CLock * pLock) 
        { 
                m_pLock = pLock; 
                pLock->lock(); 
        } 
        ~CAutoLock() 
        { 
                m_pLock->unLock(); 
        } 
}; 

这样使用的时候就不用担心少写了unlock造成死锁, 有点智能指针的味道。

CLock  lock;
void test()
{
    CAutoLock  lock(&lock);
    //do something;

}


根据以上思路,翻译成delphi:

type
  TLock=class
  private
    v_section:TRTLCriticalSection;

    procedure lock;
    procedure unlock;
  public
    constructor Create();
    destructor Destroy; override;
  end;
  PTLock=^TLock;

  TLockEx=class(TLock)
  private
    v_lockex:PTLock;
  public
    constructor Create(lockex:PTLock);
    destructor Destroy; override;
  end;

implementation

constructor TLock.Create();
begin
  InitializeCriticalSection(v_section);
end;

destructor TLock.Destroy;
begin 
  DeleteCriticalSection(v_section);
  inherited;
end;

procedure TLock.lock;
begin
  EnterCriticalSection(v_section); 
end;

procedure TLock.unlock;
begin
  LeaveCriticalSection(v_section);
end;

constructor TLockEx.Create(lockex:PTLock);
begin
  v_lockex :=lockex;
  v_lockex^.lock;
end;

destructor TLockEx.Destroy;
begin
  v_lockex^.unlock;
  inherited;
end;


 


可以如下调用:

var
  v_locks:TLock;

procedure tests();
var
  p_lock:TLockEx;
begin
  p_lock:=TLockEx.Create(@v_locks);
  //do something
  FreeAndNil(p_lock);
end;





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值