问题标签 [constrained-execution-reg]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
8196 浏览

.net - “Critical Section”、“Critical Region”和“Constrained Execution Region”的区别

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

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

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

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

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

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

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

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

0 投票
1 回答
166 浏览

c# - 具有内存压力的 SafeHandle

该类SafeHandle允许通过引用计数和 P/Invoke 编组器的合作安全访问 .NET 下的本机资源,以避免过早处理可能导致应用程序崩溃的句柄。

在某些情况下,通知垃圾收集器某些本机资源正在使用大量内存是有利的,例如,当所讨论的“句柄”是一个封装的本机库拥有的大缓冲区时。GC.AddMemoryPressure可用于此目的;但是,GC.RemoveMemoryPressure必须在“句柄”的生命周期结束时调用。

这两种方法似乎是不兼容的:SafeHandleis aCriticalFinalizerObject和它的ReleaseHandle方法在受约束的执行区域 (CER) 中运行。与GC.RemoveMemoryPressurenoReliabilityContractAttribute一样,不能从 CER 调用它(我猜在关键的完成时间,与内存压力有关的 GC 的某些部分可能不可用)。

我想到了两种方法,都非常不雅:

  1. 可以将 SafeHandle 包装到另一个对象中,该对象具有添加和删除内存压力的非关键终结器(和 Dispose 方法)。这有两个不足:首先,有人可以在不处理包装器的情况下处理 SafeHandle(它必须暴露才能传递给本地方法),因此内存压力被高估了。其次,当 SafeHandle 还活着时,包装器可能会变得未被引用,因此内存压力被低估了(可能更严重)。

  2. SafeHandle 有一个管理内存压力的非关键可终结类型的字段。在这种情况下,上面的大多数问题都消失了,但是,句柄无法在其 Dispose 或 ReleaseHandle 方法中释放内存压力对象,因为这会导致 CER 中的 GC.RemoveMemoryPressure 调用。可以提供另一种方法(例如 DisposeNoncriticial),但是当句柄被强制转换为 IDisposable 或在 using 块中使用时,这会导致“切片”问题。

是否有创建具有相关内存压力的 SafeHandle 的通用模式?

0 投票
1 回答
56 浏览

c# - 如何打破仅包含受限执行区 (CER) 的循环

我正在使用受约束的执行区域 (CER) 来保护线程的 while 循环中的代码段:

问题是,如果我不在Thread.Sleep(1)while 循环结束时引入语句,则在线程上调用 Thread.Abort() 的任何尝试都会挂起。有没有更好的方法可以在不使用该Thread.Sleep()函数的情况下中止线程?

0 投票
0 回答
64 浏览

c# - Task.Run 和 await 可以在受约束的执行区域中使用吗?

可以在受约束的执行区域中运行的代码可能不会

  • 使用显式分配
  • 使用拳击
  • 获取锁
  • 虚拟调用未准备好的方法
  • 调用具有弱或不存在可靠性契约的方法。

(取自MSDN,强调我的)。


我想在受约束的执行中执行的代码是这样的

检查了生成的 IL并没有在相关代码中找到任何callvirt, newobjorbox指令,所以我认为我应该是安全的。


我现在的问题/问题是:

  • 由于Task.Run没有ReliabilityContract定义,这是否意味着代码不能在受约束的执行区域中执行?
  • 是否Task.Runawait以某种方式创建新对象(因此使用显式分配)或获取锁?
  • 可以await在受约束的执行区域中使用吗?
0 投票
2 回答
217 浏览

c# - 为什么 PrepareConstrainedRegions 方法在 c# 中不起作用?

我读了 Jeffrey Richter 的书“CLR via C#”。在第 20 章中,有一个代码示例演示了约束执行区域 (CER) 的用法:

以及以下文字:

现在,当我运行此版本的代码时,我得到以下输出。

但是,当我运行此代码时,无论是否使用 CER,我都会得到以下输出:

因此,构造函数在块之后Type2被调用(打破了 CER 用法的含义,据我所知)。 try

这可能是什么原因?

编辑: 我正在使用 .Net Core 3.1 和 VS Enterprise 2019 Preview Version 16.6.0 Preview 3.0,我的代码是:

顺便说一句,Type2类可以在里面Program,它不会改变输出。