“关键部分”,“关键区域”和“约束执行区域”之间的区别
这些实际上是三个不同的概念还是我混乱? (我一直在阅读有关线程和垃圾收集物品一起,混淆了自己。)“关键部分”,“关键区域”和“约束执行区域”之间的区别
“临界区” - 我想这可能只是对于你不想多线程的代码段术语同时访问,即内部锁和Monitor.Enter/Exit语句?
“关键区域” - 这里没有真正的线索 - MSDN说的是“这告诉主机,该部分中引发的异常可能会产生更广泛的影响”。而且“CLR的主机,例如Sql Server”可以选择“以不同方式”处理在关键区域内抛出的异常。不同的是如何?为什么?而且,最重要的是,在我需要将代码标记为关键区域的现实世界场景中,
“受限制的执行区域” - 我在阅读垃圾回收文章中的CriticalFinalizerObject时发现了这个问题。
从MSDN我可以理解的是,这些区域之一的代码在某种程度上可以保证运行(但是如何?),因此不得抛出“带外”异常。
什么是out-of-band exception
? (我做过谷歌这个,但它只是问我是否意味着“越界异常”)。
是否有任何未处理的异常?还是只有某些类型的异常?而且,最重要的是,在真实世界的场景中,我可能需要一个“受限制的执行区域”吗?
因为我不太了解这些概念,所以我不确定这个问题除了“.NET”之外还需要什么标签。
只是我对这些概念的理解:
临界区 - 如你所说。
关键区域 - 这似乎是“不让异常从线程中逃脱”的大图片版本。
约束执行区域 - 这是一种通过防止异常中断来使代码片段更原子化的方法。 example on this page使用它来确保执行句柄的分配和存储。请注意,没有回滚,这更像是一个预防性系统。
“正常编程”的指导方针看起来有点像这样,即当重写Equals或隐式操作符时,不应该抛出(任何东西)。
对不起,谢谢。 +1,我接受这个描述并链接到示例组合。我真的希望对“关键区域”有详细的了解,究竟是一个什么样的带外例外,但我可能不应该提出多个问题。 – 2009-04-15 08:01:29
带外异常是一种异常,不是由当前直接执行的代码抛出,而是由框架的一部分抛出。此术语包含以下例外:StackOverflowException,OutOfMemoryException和ThreadAbortException。 – 2010-08-11 21:09:00
根据由Joe达菲在Windows并发编程为临界区/区域中的定义如下:
临界区:在Win32关键部分是一个简单的数据结构(CRITICAL_SECTION
)用于构建关键区域。
关键区域:是一个代码区域,享有互斥(这似乎是你所指的是上面的关键部分)。
感谢您的回应。 “关键部分”来自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
在Windows中,目前为止我只使用临界区。 据我的经验,它是一个Win32用户空间线程锁定机制。这意味着它可以在一个进程中用于锁定多个线程共享的资源。这不是全系统的,只是整个过程。内核空间锁(例如互斥锁)就是一个例子。
例如,boost :: thread在其Win32实现中使用了关键部分 - 或者至少在我使用它的时候 - 而且在Linux中通过pthreads使用了互斥体。
在另一个进程可以输入之前,应由每个进程开始的代码的任何部分都称为关键区域。
关键部分:是一段代码。每个进程都有一个关键部分,其中交换comon变量,更新表,写入文件和......重要的特征是,当一个进程在其临界区执行时,不允许其他进程进入其临界区并提供手动排除。当然,为了达到这个目的,当出现'n'个进程时,使用称为“信号量”的同步工具。信号量是一个可变的整数。
关键区域:是一种同步构造,它可以防止与信号量解决方案相关的某些简单错误,从而解决程序员可能犯的关键部分问题。
关键部分一组指令,其中一些指令访问共享对象。
暂时忽略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不遵守互斥。您需要在关键区域实施相互排斥,在组成该区域的每个关键部分实施。
微软可以有不同定义的东西,但在一般情况下,关键区域和关键部分是同样的事情。
它们被用来描述区域,其中两个或更多个进程(或线程)被访问的相同的共享存储器,和失败到坐标它们将导致竞争条件防止所需在执行中的行为,比如Pétur给出的用于递增和递减变量的典型例子。
一个很好的讨论可以在Tanenbaum,A. S.和Bos,H。(2015)中找到。 现代操作系统(Pearson,波士顿,麻省),第4版,第1101页。早期版本以及众多大学的课程网站,它们为其操作系统课程提供材料。
我很确定你对关键部分的理解是正确的。 – Brian 2009-04-14 13:32:35
这是一个开始:)。我不确定我是否使用了正确的术语。我在关于锁定的文章中看到了“关键部分”。我只在Thread.BeginCriticalRegion的MSDN页面中看到“Critical Region”。我知道“受限制的执行区域”是因为它有一个MSDN页面。 – 2009-04-14 13:46:27