我正在使用线程,这就是我使用互斥锁来锁定共享资源的原因。锁定的基本用法是将资源放在锁定/解锁块中。
procedure RefreshData;
begin
DataLock;
GetData;
GetSettings;
CheckValues;
...
DataUnlock;
end;
因为总有一对Lock / Unlock我开始考虑简化的锁定/解锁方法,它会在不再需要时自动解锁资源。
所以我的想法是引入新程序,该程序将输入参数作为对precedure的引用。这将使我能够使用匿名方法。
代码如下:
type TBaseProc = reference to procedure;
procedure TMyObject.LockMethod(AMeth: TBaseProc);
begin
DataLock;
try
AMeth;
finally
DataUnlock;
end;
end;
procedure TForm1.RefreshData;
begin
MyObject.LockMethod(
procedure
begin
GetData;
GetSettings;
CheckValues;
...
end;
);
end;
这种方法是否有任何意义,或者是否有更好或更简单的解决方案?
谢谢和问候。
答案 0 :(得分:0)
这种方法远非完美,因为正如我从您的代码中所理解的那样,每个应用程序只有一个锁。当每个独立数据实体都有自己的锁时,它会更好。所以你会有一个像这样的抽象类:
type
TAbstractData = class
private
CriticalSection: TRtlCriticalSection
public
constructor Create;
procedure Lock;
procedure Unlock;
destructor Destroy; override;
end;
然后从这个实现锁定的抽象类继承其他类。
constructor TAbstractData .Create;
begin
inherited Create;
InitializeCriticalSection(CriticalSection);
end;
procedure TAbstractData.Lock;
begin
EntercriticalSection(CriticalSection);
end;
procedure TAbstractData.Unlock;
begin
LeaveSection(CriticalSection);
end;
procedure TAbstractData.Destroy;
begin
DeleteCriticalSection(CriticalSection);
inherited Destroy;
end;
CriticalSection是迄今为止在Windows中实现的最有效的同步分支。它实际上是免费的 - 除非存在线程争用,否则几乎不消耗任何系统资源,并且当只有一个线程使用数据时不会调用昂贵的上下文切换。
在我提交答案后,我们在互联网上发现了一篇好文章 - http://blog.synopse.info/post/2016/01/09/Safe-locks-for-multi-thread-applications - 作者推荐了类似的方法。