问题描述
我正在更新仅使用TCriticalSection.Acquire/Release
对而不是Enter/Release or Leave
对的Delphi(Delphi 2009)代码。我的问题是-Acquire
和Enter
有什么区别?
Delphi文档非常模糊-它甚至试图说没有区别:
获取:将关键部分绑定到调用线程。呼叫 获得阻止所有其他线程获得此关键 直到调用Release或Leave方法。获取执行 与Enter方法相同。
Enter:在调用线程进入 线程敏感部分。调用Enter阻止其他所有线程 输入此关键部分保护的代码,直到请假或 释放方法被调用。 Enter调用Acquire方法来绑定 调用线程的关键部分。
我想使用方法TryAcquire
,但是没有这样的方法,因此-我正在考虑将我对Acquire
的所有调用替换为TryEnter... Sleep...
循环,该循环是有界的通过TryEnter调用次数的数量。但是要确定会发生什么,我应该知道Acquire
和Enter
之间的区别吗?这有什么区别?为什么要使用两种不同的方法?
解决方法
对于TCriticalSection
没有区别。 Enter
被实现为对Acquire
的调用。对于Leave
也是如此,它被实现为对Release
的调用。
TryEnter
方法是在Delphi 2009之后添加的。但这只是Windows API调用TryEnterCriticalSection
的简单包装。您可以自己直接调用该函数。例如,您可以使用类帮助器将TryEnter
引入TCriticalSection
的范围内。