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

Nix*_*Nix 5 delphi mutex locking anonymous-function delphi-xe6

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

procedure RefreshData;
begin    
   DataLock;
      GetData;
      GetSettings;
      CheckValues;
      ...
   DataUnlock;
end;
Run Code Online (Sandbox Code Playgroud)

因为总有一对锁定/解锁我开始考虑简化锁定/解锁方法,这将在不再需要时自动解锁资源.

所以我的想法是引入新程序,该程序将输入参数作为对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;
Run Code Online (Sandbox Code Playgroud)

这种方法有任何意义,还是有更好甚至更简单的解决方案?

感谢致敬.

Max*_*tin 1

这种方法远非完美,因为正如我从您的代码中了解到的那样,每个整个应用程序都有一个锁。当每个独立的数据实体都有自己的锁时会更好。所以你会有一个像这样的抽象类:

type
  TAbstractData = class
    private
       CriticalSection: TRtlCriticalSection
    public
       constructor Create;
       procedure Lock;
       procedure Unlock;
       destructor Destroy; override;
  end;
Run Code Online (Sandbox Code Playgroud)

然后从这个实现锁定的抽象类继承其他类。

       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;
Run Code Online (Sandbox Code Playgroud)

ACriticalSection是Windows中实现的最高效的同步类。它实际上是免费的——除非存在线程争用,否则几乎不消耗任何系统资源,并且当只有一个线程使用数据时不会调用昂贵的上下文切换。

我提交答案后,在网上找到了一篇不错的文章 - http://blog.synopse.info/post/2016/01/09/Safe-locks-for-multi-thread-applications - 作者推荐类似的方法。