2014-02-11 126 views
5

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

到目前为止这么好。

但是在其他平台下的行为怎么样德尔福支持诸如OSX,iOS和Android?

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

回答

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; 
    ... 
+0

能TMonitor在XE5值得信赖吗?旧版的Delphi版本暴露了TMonitor的问题... – whosrdaddy

+0

@Uwe Raabe我看到TCriticalSection使用了TMonitor,但是我没有在DocWiki/XE5中找到TMonitor。我编辑了我的问题,在其中添加TMonitor。 – fpiette

+0

@whosrdaddy我不在乎旧的Delphi版本。我正在使用XE5。 – fpiette

相关问题