【问题标题】:Can TCriticalSection.Acquire be safely called more than one time by a thread?一个线程可以多次安全地调用 TCriticalSection.Acquire 吗?
【发布时间】:2014-02-11 12:12:36
【问题描述】:

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

到目前为止一切顺利。

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

其他平台似乎也在使用 TMonitor。所以这个问题可以针对 TMonitor 重写。

【问题讨论】:

    标签: android ios multithreading macos delphi


    【解决方案1】:

    在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;
      ...
    

    【讨论】:

    • 在 XE5 中可以信任 TMonitor 吗?较旧的 Delphi 版本暴露了 TMonitor 的问题...
    • @Uwe Raabe 我看到 TCriticalSection 使用了 TMonitor,但我没有在 DocWiki/XE5 中找到 TMonitor 文档。我编辑了我的问题以在其中添加 TMonitor。
    • @whosrdaddy 我不关心旧的 Delphi 版本。我正在使用 XE5。
    • 据我了解,它至少在 Windows 上是固定的。但我可能永远不会相信它。
    • @Andy_D - 该帖子的第四段写道:“编辑 2013-08-24:看起来这里讨论的问题应该在 XE5 中解决,参见 Allen Bauer 的监控监视器。”跨度>
    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多