【问题标题】:Delphi TCriticalSection Acquire vs Enter - what is the difference?Delphi TCriticalSection Acquire vs Enter - 有什么区别?
【发布时间】:2020-09-25 11:46:55
【问题描述】:

我正在更新 Delphi (Delphi 2009) 代码,它专门使用 TCriticalSection.Acquire/Release 对,而不是 Enter/Release or Leave 对。我的问题是 - AcquireEnter 有什么区别?

Delphi 文档非常晦涩——它甚至试图说没有区别:

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/!!MEMBERTYPE_Methods_SyncObjs_TCriticalSection.html

Acquire:将临界区绑定到调用线程。称呼 获取以阻止所有其他线程获取此关键 部分,直到调用 Release 或 Leave 方法。获取 与 Enter 方法相同。

Enter:当调用线程进入某个线程时阻塞其他线程 线程敏感部分。调用 Enter 阻止所有其他线程 输入受此关键部分保护的代码,直到离开或 调用释放方法。 Enter 调用 Acquire 方法绑定 调用线程的临界区。

我想要方法TryAcquire,但没有这样的方法,所以-我正在考虑用TryEnter... Sleep...循环替换我对Acquire的所有调用,该循环受TryEnter调用次数的限制努力。但要确定会发生什么,我应该知道AcquireEnter 之间的区别?这个区别是什么?为什么有两种不同的方法?

【问题讨论】:

  • Enter 只是 Acquire 的别名,Acquire 是从 TSynchroObject 继承的名称,并具有覆盖实现。

标签: delphi delphi-2009 critical-section


【解决方案1】:

TCriticalSection 没有区别。 Enter 被实现为对 Acquire 的调用。 Leave 也是如此,它被实现为对 Release 的调用。

TryEnter 方法是在 Delphi 2009 之后添加的。但它只是对 Windows API 调用 TryEnterCriticalSection 的简单包装。您可以自己直接调用该函数。例如,您可以使用类助手将TryEnter 引入TCriticalSection 的范围内。

【讨论】:

    猜你喜欢
    • 2012-04-03
    • 2011-05-23
    • 1970-01-01
    • 2014-07-01
    • 2021-07-16
    • 2013-03-18
    • 1970-01-01
    • 2013-01-15
    相关资源
    最近更新 更多