TCriticalSection TryEnter方法始终返回True

时间:2015-12-10 07:35:33

标签: delphi winapi

在TCriticalSection上调用TryEnter方法时,结果始终为true。当然,如果能够获得锁定,这应该只返回真的吗?

var
  MyCritSect: TCriticalSection;

begin
  MyCritSect := TCriticalSection.Create;
  try
    //    MyCritSect.Enter;
    Writeln(BoolToStr(MyCritSect.TryEnter, True)); // This should return True
    Writeln(BoolToStr(MyCritSect.TryEnter, True)); // This should return False?
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

即使您取消注释MyCritSect.Enter;行,对于两次调用TryEnter,它仍会返回True。

我正在使用Delphi XE和Windows 10。

1 个答案:

答案 0 :(得分:4)

关键部分为re-entrant locks。来自documentation

  

当线程拥有一个关键部分时,它可以对EnterCriticalSection或TryEnterCriticalSection进行额外调用,而不会阻止其执行。这可以防止线程在等待它已经拥有的关键部分时自行死锁。

如果从另一个线程发出,您对TryEnter的调用将失败,并且第一个线程已经拥有该锁。