可以通过线程多次安全地调用TCriticalSection.Acquire吗?

时间:2014-02-11 12:12:37

标签: android ios multithreading macos delphi

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

到目前为止一切顺利。

但是Delphi支持的其他平台下的行为如OSX,iOS和Android呢?

其他平台似乎都在使用TMonitor。所以问题可以改写为TMonitor。

1 个答案:

答案 0 :(得分:4)

在Windows之外的其他平台上实施TCriticalSection只是使用TMonitor。因此,您的问题的答案减少了TMonitor.Enter的行为。至少文档说明TMonitor.Enter是可重入的。

documentation的这一部分对你的答案意味着“是”:

  

禁止所有其他线程访问,但调用该线程到指定对象。

TMonitor的相关代码部分位于TMonitor.TryEnter:

function TMonitor.TryEnter: Boolean;
begin
  if FOwningThread = GetCurrentThreadId then  // check for recursion
  begin
    ...
    Result := True;
  ...