Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 线程能否多次安全地调用TCriticalSection.Acquire?_Android_Ios_Multithreading_Macos_Delphi - Fatal编程技术网

Android 线程能否多次安全地调用TCriticalSection.Acquire?

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以外

在Windows平台上,TCriticalSection通过调用Windows API EnterCriticalSection/LeaveCriticalSection来实现。Microsoft文档明确指出,线程拥有关键部分的所有权后,可以对EnterCriticalSection进行其他调用

到目前为止还不错

但是,在Delphi支持的其他平台(如OSX、iOS和Android)下的行为如何


其他平台似乎也在使用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监控监视器。”