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

fpi*_*tte 5 delphi macos multithreading android ios

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

到现在为止还挺好.

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

其他平台似乎使用TMonitor.所以这个问题可以改写为TMonitor.

Uwe*_*abe 5

TCriticalSection 在 Windows 以外的其他平台下的实现简单地使用了 TMonitor。因此,您的问题的答案归结为 TMonitor.Enter 的行为。至少文档指出 TMonitor.Enter 是可重入的。

文档的这一部分对您的回答表示“是”:

除了调用指定对象的线程外,禁止所有其他线程的访问。

TMonitor 的相关代码部分在 TMonitor.TryEnter 中:

function TMonitor.TryEnter: Boolean;
begin
  if FOwningThread = GetCurrentThreadId then  // check for recursion
  begin
    ...
    Result := True;
  ...
Run Code Online (Sandbox Code Playgroud)