.net - "Critical Section"、 "Critical Region"和 "Constrained Execution Region"之间的区别

标签 .net critical-section critical-region constrained-execution-reg

这实际上是三个不同的概念还是我混淆了? (我一直在阅读有关线程和垃圾收集的文章,但我自己也很困惑。)

“关键部分” - 我认为这可能只是您不希望多个线程同时访问的代码部分的术语,即在 lock 和 Monitor.Enter/Exit 语句内?

“关键区域” - 这里没有真正的线索 - MSDN 说了类似“这告诉主机该部分中抛出的异常可能会产生更广泛的影响”的内容。并且“CLR 的主机(例如 Sql Server)”可以选择“以不同的方式”处理关键区域内引发的异常。不同如何?为什么?而且,最重要的是,在哪些现实场景中我可能需要将代码标记为关键区域?

“约束执行区域” - 我在垃圾收集文章中阅读有关 CriticalFinalizerObject 的内容时遇到了这一点。

我从 MSDN 中所能了解到的就是,这些区域之一内的代码以某种方式保证运行(但如何保证?),因此不得抛出“带外”异常。

什么是带外异常? (我确实用谷歌搜索了这个,但它只是问我是否意味着“越界异常”)。

是否有未处理的异常?或者只是某些类型的异常(exception)?再说一遍,最重要的是,在现实世界的哪些场景中我可能需要“受限执行区域”?

由于我不太理解这些概念,所以我不确定这个问题除了“.NET”之外还需要什么标签。

最佳答案

只是我对这些概念的理解:

关键部分 - 正如你所说。

关键区域 - 这似乎是“不要让异常从线程中逃逸”的大图版本。

约束执行区域 - 这是一种通过防止异常中断来使一段代码或多或少具有原子性的方法。 example on this page使用它来确保句柄的分配和存储都被执行。请注意,没有回滚,它更像是一个预防系统。

“正常编程”的指导方针看起来有点像这样,即当覆盖 Equals 或隐式运算符时,您不应该抛出(任何东西)。

关于.net - "Critical Section"、 "Critical Region"和 "Constrained Execution Region"之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/747551/

相关文章:

operating-system - 临界区的进度和有界等待是什么?

c++ - c++进入临界区和上下文切换

c++ - WinAPI 定时互斥锁

c - 如何将客户端和服务器链接到同一个信号量

c# - 在 Javascript 中绑定(bind) Radscheduler

c# - 使用线程池时如何判断线程何时完成?

c# - 无法在 .NET FX4.6 上的 .NET Standard2.0 库中使用 System.Configuration.Configuration 管理器

c# - 什么是实现对象池的好方法?