15

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

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

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

“受约束的执行区域” - 我在阅读垃圾收集文章中的 CriticalFinalizerObject 时遇到了这个问题。

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

什么是out-of-band exception? (我确实在谷歌上搜索过,但它只是问我是否是指“越界异常”)。

是否有任何未处理的异常?还是只有某些类型的例外?再一次,最重要的是,在哪些现实世界场景中我可能需要“受约束的执行区域”?

由于我完全不了解这些概念,因此我不确定这个问题除了“.NET”之外还需要什么标签。

4

8 回答 8

7

微软可能对事物的定义不同,但总的来说,临界区临界区同一回事

它们用于描述两个或多个进程(或线程)正在访问同一共享内存的区域如果无法协调它们将导致竞争条件,从而阻止所需的执行行为,例如 Pétur 给出的递增的经典示例并减少上面的变量。

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

于 2016-01-04T00:56:13.283 回答
6

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

关键部分- 正如你所说。

临界区- 这似乎是“不要让异常从线程中逃脱”的大图版。

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

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

于 2009-04-14T13:58:27.570 回答
3

根据 Joe Duffy 在 Windows 上的并发编程,临界区/区域的定义如下:

临界区:在 Win32 中临界区是一个简单的数据结构(CRITICAL_SECTION),用于构建临界区。

临界区:是一个享有互斥的代码区域(这似乎是您在上面所说的临界区)。

于 2009-04-14T13:49:54.940 回答
3

这篇博文将填补你的困惑。 关联

于 2010-11-10T02:17:55.413 回答
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 不遵守互斥。您需要在关键区域上实现互斥,方法是在构成该区域的每个关键部分上实现互斥。

于 2014-10-23T16:18:23.543 回答
0

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

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

于 2009-04-14T16:36:40.873 回答
0

任何在另一个进程进入之前应该由每个进程完成的代码部分称为临界区。

于 2009-05-25T08:48:05.037 回答
0

临界区:是一段代码。每个进程都有一个临界区,用于交换公共变量、更新表、写入文件等...重要的特点是,当一个进程在其临界区执行时,不允许其他进程进入其临界区,并提供手动排除。当然,为了实现这一点,当有 arw 'n' 个进程时,使用称为“信号量”的同步工具。信号量是一个整数变量。

临界区:是一种同步结构,可防止与程序员可能对临界区问题的信号量解决方案相关的某些简单错误。

于 2014-03-17T17:59:44.727 回答