在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。
答案 0 :(得分:4)
关键部分为re-entrant locks。来自documentation:
当线程拥有一个关键部分时,它可以对EnterCriticalSection或TryEnterCriticalSection进行额外调用,而不会阻止其执行。这可以防止线程在等待它已经拥有的关键部分时自行死锁。
如果从另一个线程发出,您对TryEnter
的调用将失败,并且第一个线程已经拥有该锁。