TCriticalSection TryEnter方法始终返回True

Don*_*ddy 5 delphi winapi

在TCriticalSection上调用TryEnter方法时,结果始终为true.当然,如果能够获得锁定,这应该只返回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.
Run Code Online (Sandbox Code Playgroud)

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

我正在使用Delphi XE和Windows 10.

Dav*_*nan 4

临界区是可重入锁。从文档中:

当线程拥有临界区时,它可以对 EnterCriticalSection 或 TryEnterCriticalSection 进行其他调用,而不会阻止其执行。这可以防止线程在等待它已经拥有的临界区时发生死锁。

TryEnter如果从不同的线程进行调用,并且第一个线程已经拥有锁,则您的调用将会失败。