使用单个命令锁定和解锁资源

时间:2014-11-20 08:45:42

标签: delphi locking mutex anonymous-function delphi-xe6

我正在使用线程,这就是我使用互斥锁来锁定共享资源的原因。锁定的基本用法是将资源放在锁定/解锁块中。

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;

这种方法是否有任何意义,或者是否有更好或更简单的解决方案?

谢谢和问候。

1 个答案:

答案 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 - 作者推荐了类似的方法。