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

来源:互联网 发布:中国出口数据统计 编辑:程序博客网 时间:2024/06/05 15:43

      在网上无意间看到了一个关于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;implementationconstructor 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;





原创粉丝点击