delphi - Delphi TCriticalSection Acquire vs Enter - 有什么区别?
问题描述
我正在更新仅使用TCriticalSection.Acquire/Release
对而不是Enter/Release or Leave
对的 Delphi (Delphi 2009) 代码。Acquire
我的问题是 -和有什么区别Enter
?
Delphi 文档非常晦涩 - 它甚至试图说没有区别:
Acquire:将临界区绑定到调用线程。调用 Acquire 以阻止所有其他线程获取此临界区,直到调用 Release 或 Leave 方法。Acquire 的作用与 Enter 方法相同。
Enter:当调用线程进入线程敏感部分时阻塞其他线程。调用 Enter 以阻止所有其他线程进入受此关键部分保护的代码,直到调用 Leave 或 Release 方法。Enter 调用 Acquire 方法将临界区绑定到调用线程。
我想要方法TryAcquire
,但没有这样的方法,所以 - 我正在考虑Acquire
用TryEnter... Sleep...
循环替换我的所有调用,这受 TryEnter 调用次数的限制。Acquire
但要确定会发生什么,我应该知道和之间的区别Enter
?这个区别是什么?为什么有两种不同的方法?
解决方案
因为TCriticalSection
没有区别。Enter
被实现为对 的调用Acquire
。同样 for Leave
which 被实现为对Release
.
该TryEnter
方法是在 Delphi 2009 之后添加的。但它只是对 Windows API 调用的简单包装TryEnterCriticalSection
。您可以自己直接调用该函数。例如,您可以使用类助手TryEnter
将TCriticalSection
.
推荐阅读
- visual-studio-code - 出现在无标题编辑器上的“选择语言”文本的范围是什么?
- asp.net-core - .NET Core Identity Framework 和 Telegram 登录小部件,没有数据库
- python - Tensorflow 类 BinaryCrossentropy 和函数 binary_crossentropy 的区别
- email - Blazor .Net 5 身份注册与电子邮件确认
- machine-learning - PyTorch 中的置换操作是可微分操作吗
- javascript - 如何用更少的代码创建一个 jQuery 函数
- r - 使用汇总(dplyr)从列中获取第一个非空日期
- python - 选择哪一点将有正确的 mp3 文件用于导出
- c# - 使用两个数据库时,实体框架实体类型“未映射 CustomerSpendings”
- javascript - 为什么 Mongoose 只保存部分数据?