首页 > 解决方案 > Delphi TCriticalSection Acquire vs Enter - 有什么区别?

问题描述

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

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

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

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

Enter:当调用线程进入线程敏感部分时阻塞其他线程。调用 Enter 以阻止所有其他线程进入受此关键部分保护的代码,直到调用 Leave 或 Release 方法。Enter 调用 Acquire 方法将临界区绑定到调用线程。

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

标签: delphidelphi-2009critical-section

解决方案


因为TCriticalSection没有区别。Enter被实现为对 的调用Acquire。同样 for Leavewhich 被实现为对Release.

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


推荐阅读