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

时间:2009-04-14 13:24:13

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

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

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

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

“约束执行区域” - 在阅读垃圾收集文章中的CriticalFinalizerObject时遇到过这种情况。

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

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

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

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

8 个答案:

答案 0 :(得分:6)

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

它们用于描述两个或多个进程(或线程)访问 相同共享内存失败到<的区域strong> 坐标 它们将导致竞争条件阻止执行中的所需行为,例如Pétur为递增和递减上面的变量而提供的经典示例。

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

答案 1 :(得分:5)

我对这些概念的理解是:

关键部分 - 正如您所说。

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

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

对于“正常编程”有一些指导看起来有点像这样,即当重写Equals或隐式运算符时,你不应抛出(任何东西)。

答案 2 :(得分:2)

根据Joe Duffy对Windows的并发编程,关键部分/区域的定义如下:

关键部分:在Win32关键部分是一个用于构建关键区域的简单数据结构(CRITICAL_SECTION)。

关键区域:是一个享有互斥的代码区域(这似乎是您在上面提到的一个关键部分)。

答案 3 :(得分:2)

此博客文章将填补您的困惑。 http://blogs.msdn.com/b/bclteam/archive/2005/06/14/429181.aspx

答案 4 :(得分:1)

关键部分一组指令,其中一些指令访问共享对象。

暂时忽略ProcessA和ProcessB可以同时执行。如果要由许多不同的线程同时执行ProcessA或ProcessB,您不希望依赖于x的值,因为它很可能导致竞争条件。

在此示例中,两个while循环是Critical Sections。

int x = 0;
Process A() {
    while(true) {
        x++;
        x--;
    }
}
Process B() {
    while(true) {
        x++;
        x--;
    }
}

关键区域一组关键部分。

现在假设您可以同时执行ProcessA和ProcessB。每个流程都有一个关键部分。两个部分共享相同的变量(x)。这两个关键部分共同构成了一个关键区域。为什么这很重要?如果您假设ProcessA的关键部分受到互斥的保护,那么您仍然会在x中得到不正确的结果,因为ProcessB不遵守互斥规则。您需要在关键区域实施互斥,方法是在构成该区域的每个关键部分实施。

答案 5 :(得分:0)

在Windows中,到目前为止我只使用关键部分。 根据我的经验,它是一个Win32用户空间线程锁定机制。这意味着它可以在一个进程中用于锁定多个线程共享的资源。这不是系统范围的,只是整个流程范围。它不是一个内核空间锁(如互斥锁)的一个例子。

例如,boost :: thread在其Win32实现中使用关键部分 - 或者至少在我使用它时使用 - 并在Linux中使用互斥,通过pthreads。

答案 6 :(得分:0)

每个进程应该在另一个进程可以进入之前完成的任何代码段都称为关键区域。

答案 7 :(得分:0)

关键部分:是一段代码。每个进程都有一个关键部分,其中交换comon变量,更新表,写文件和...重要的特征是,当一个进程在其关键部分执行时,不允许其他进程进入其关键部分并提供手册排除。当然,要实现这一点,一个名为&#34; semaphore&#34;的同步工具。当有新的时候使用流程。信号量是整数可变的。

关键区域:是一种同步构造,可防止与信号量解决方案相关的某些简单错误,以解决程序员可能产生的关键部分问题。