Android 线程能否多次安全地调用TCriticalSection.Acquire?
在Windows平台上,TCriticalSection通过调用Windows API EnterCriticalSection/LeaveCriticalSection来实现。Microsoft文档明确指出,线程拥有关键部分的所有权后,可以对EnterCriticalSection进行其他调用 到目前为止还不错 但是,在Delphi支持的其他平台(如OSX、iOS和Android)下的行为如何Android 线程能否多次安全地调用TCriticalSection.Acquire?,android,ios,multithreading,macos,delphi,Android,Ios,Multithreading,Macos,Delphi,在Windows平台上,TCriticalSection通过调用Windows API EnterCriticalSection/LeaveCriticalSection来实现。Microsoft文档明确指出,线程拥有关键部分的所有权后,可以对EnterCriticalSection进行其他调用 到目前为止还不错 但是,在Delphi支持的其他平台(如OSX、iOS和Android)下的行为如何 其他平台似乎也在使用TMonitor。因此,这个问题可以用TMonitor重写。在Windows以外
其他平台似乎也在使用TMonitor。因此,这个问题可以用TMonitor重写。在Windows以外的其他平台上实现TCriticalSection只是使用TMonitor。因此,您的问题的答案归结为TMonitor.Enter的行为。至少文档说明TMonitor.Enter是可重入的 这部分内容意味着你的回答是“是”: 禁止除调用线程外的所有其他线程访问指定对象 TMonitor的相关代码部分位于TMonitor.TryEnter中:
function TMonitor.TryEnter: Boolean;
begin
if FOwningThread = GetCurrentThreadId then // check for recursion
begin
...
Result := True;
...
XE5中是否可以信任TMonitor?旧的Delphi版本暴露了TMonitor的问题…@Uwe Raabe我看到TCriticalSection使用了TMonitor,但我没有发现DocWiki/XE5中记录了TMonitor。我编辑了我的问题,在其中添加了TMonitor。@whosrdaddy我不关心旧的Delphi版本。我正在使用XE5。据我所知,它至少在Windows上是固定的。但我可能永远不会相信它。@Andy_D-那篇文章的第四段写道:“编辑2013-08-24:看起来这里讨论的问题应该在XE5中解决,cf由Allen Bauer监控监视器。”