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