14

这些实际上是三个不同的概念还是我混乱? (我一直在阅读有关线程和垃圾收集物品一起,混淆了自己。)“关键部分”,“关键区域”和“约束执行区域”之间的区别

“临界区” - 我想这可能只是对于你不想多线程的代码段术语同时访问,即内部锁和Monitor.Enter/Exit语句?

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

“受限制的执行区域” - 我在阅读垃圾回收文章中的CriticalFinalizerObject时发现了这个问题。

从MSDN我可以理解的是,这些区域之一的代码在某种程度上可以保证运行(但是如何?),因此不得抛出“带外”异常。

什么是out-of-band exception? (我做过谷歌这个,但它只是问我是否意味着“越界异常”)。

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

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

+0

我很确定你对关键部分的理解是正确的。 – Brian 2009-04-14 13:32:35

+0

这是一个开始:)。我不确定我是否使用了正确的术语。我在关于锁定的文章中看到了“关键部分”。我只在Thread.BeginCriticalRegion的MSDN页面中看到“Critical Region”。我知道“受限制的执行区域”是因为它有一个MSDN页面。 – 2009-04-14 13:46:27

回答

5

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

临界区 - 如你所说。

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

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

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

+0

对不起,谢谢。 +1,我接受这个描述并链接到示例组合。我真的希望对“关键区域”有详细的了解,究竟是一个什么样的带外例外,但我可能不应该提出多个问题。 – 2009-04-15 08:01:29

+2

带外异常是一种异常,不是由当前直接执行的代码抛出,而是由框架的一部分抛出。此术语包含以下例外:StackOverflowException,OutOfMemoryException和ThreadAbortException。 – 2010-08-11 21:09:00

2

根据由Joe达菲在Windows并发编程为临界区/区域中的定义如下:

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

关键区域:是一个代码区域,享有互斥(这似乎是你所指的是上面的关键部分)。

+0

感谢您的回应。 “关键部分”来自http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx。和“关键区域”来自http://msdn.microsoft.com/en-us/library/system.threading.thread.begincriticalregion.aspx。也许“关键地区”,因为我列出它不是一个真正的概念? – 2009-04-14 14:02:41

0

在Windows中,目前为止我只使用临界区。 据我的经验,它是一个Win32用户空间线程锁定机制。这意味着它可以在一个进程中用于锁定多个线程共享的资源。这不是全系统的,只是整个过程。内核空间锁(例如互斥锁)就是一个例子。

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

0

在另一个进程可以输入之前,应由每个进程开始的代码的任何部分都称为关键区域。

0

关键部分:是一段代码。每个进程都有一个关键部分,其中交换comon变量,更新表,写入文件和......重要的特征是,当一个进程在其临界区执行时,不允许其他进程进入其临界区并提供手动排除。当然,为了达到这个目的,当出现'n'个进程时,使用称为“信号量”的同步工具。信号量是一个可变的整数。

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

1

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

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

在这个例子中,两个while循环是临界区。

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

临界区一组关键部分。

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

0

微软可以有不同定义的东西,但在一般情况下,关键区域关键部分同样的事情

它们被用来描述区域,其中两个或更多个进程(或线程)被访问相同的共享存储器,和失败坐标它们将导致竞争条件防止所需在执行中的行为,比如Pétur给出的用于递增和递减变量的典型例子。

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