"临界区","临界区"和"约束执行区"之间的区别

J M*_*J M 14 .net critical-section critical-region constrained-execution-reg

这些实际上是三个不同的概念还是我变得混乱?(我一直在阅读有关线程和垃圾收集的文章,并让自己感到困惑.)

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

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

"约束执行区" - 我在阅读垃圾收集文章中的CriticalFinalizerObject时遇到过这种情况.

我在MSDN上可以理解的是,其中一个区域内的代码在某种程度上可以保证运行(但是如何?)因此必须抛出"带外"异常.

什么是out-of-band exception?(我确实谷歌了,但它只是问我是否意味着"超出界限").

是否有任何未处理的例外?或者只是某些类型的例外?而且,最重要的是,在现实世界的情景中,我可能需要一个"受限制的执行区域"?

由于我根本不理解这些概念,我不确定这个问题除了".NET"之外还需要什么标签.

Mar*_*e R 6

微软可能会以不同的方式定义事物,但总的来说,关键区域关键部分相同的.

它们被用来描述两个或更多个进程(或线程)的区域访问相同的共享存储器,且故障协调它们将导致竞争条件,以防止在执行所期望的行为,如经典的例子Pétur给出递增并递减上面的变量.

在Tanenbaum,AS和Bos,H.(2015)中可以找到一个很好的讨论.现代操作系统(Pearson,Boston,Ma),第4版,第1101页.早期版本以及为其操作系统课程提供材料的众多大学的课程网站.


Hen*_*man 5

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

关键部分 - 如你所说.

关键区域 - 这似乎是"不要让异常从线程中逃脱"的大图片版本.

约束执行区域 - 这是一种通过防止异常中断来使一段代码或多或少成为原子的方法.此页面上示例使用它来确保执行句柄的分配和存储.请注意,没有回滚,它更像是一个预防系统.

有"正常编程"的指导看起来有点像这样,即当重写Equals或隐式运算符时,你不应抛出(任何东西).

  • 带外异常是一个异常,它不是由当前直接执行的代码引发的,而是由框架的一部分引发的.该术语包含以下异常:StackOverflowException,OutOfMemoryException和ThreadAbortException. (2认同)