C# 强制执行语句的顺序

2024-03-17

我的问题是关于 C#(大概还有 .Net)中的执行顺序保证。我给出了我所了解的 Java 示例来进行比较。

对于Java(来自《Java并发实践》)

只要在该线程内无法检测到重新排序,就无法保证一个线程中的操作将按照程序给定的顺序执行,即使重新排序对于其他线程来说是显而易见的。

所以代码

  y = 10;
  x = 5;
  a = b + 10;

实际上可以在赋值 y = 10 之前赋值 a=b+10

在 Java 中(来自同一本书)

当线程 A 启动由同一锁保护的同步块时,线程 A 在同步块中或同步块之前所做的所有操作对于线程 B 都是可见的。

所以在Java中

 y = 10;
 synchronized(lockObject) {
     x = 5;
 }
 a = b + 10;

y = 10 和 x = 5 保证都在 a = b + 10 之前运行(我不知道 y = 10 是否保证在 x = 5 之前运行)。

C# 代码如何保证 C# 语句的执行顺序

 y = 10;
 lock(lockObject) {
     x = 5;
 }
 a = b + 10;

我对一个可以提供明确参考或其他真正有意义的理由的答案特别感兴趣,因为这样的保证很难测试,因为它们是关于允许编译器做什么,而不是每次做什么,因为当它们失败时当线程以错误的顺序命中事物时,您将很难重现间歇性错误。


ISO 23270:2006 —信息技术—编程语言—C# http://standards.iso.org/ittf/PubliclyAvailableStandards/c042926_ISO_IEC_23270_2006%28E%29.zip,§10.10 说(我引用):

10.10 执行顺序执行应继续进行,以便每个执行线程的副作用 在关键执行点保留。 A副作用被定义为 作为对易失性字段的读取或写入、对非易失性变量的写入, 写入外部资源并引发异常。 这些副作用发生顺序的关键执行点 应保留对易失性字段的引用(第 17.4.3 节), lock 语句(§15.12),以及线程的创建和终止。 实现可以自由改变 C# 程序的执行顺序, 受以下限制:

  • 数据依赖性保留在执行线程内。 那是,每个变量的值的计算就像所有语句一样 线程中的内容按原始程序顺序执行。(强调我的)。

  • 保留初始化排序规则(§17.4.4、§17.4.5)。

  • 相对于易失性读取,保留副作用的顺序 并写道(§17.4.3)。此外,实现不需要评估部分 表达式,如果它可以推断出该表达式的值未被使用并且没有 产生所需的副作用(包括由调用方法或 访问易失性字段)。当程序执行被异步中断时 事件(例如另一个线程抛出的异常),不保证 可观察到的副作用在原始程序顺序中是可见的。

其他 CLI 标准同样可用gratis来自 ISO

  • ISO 23271:2006 — *信息技术 — 通用语言基础设施 (CLI) 分区 I 至 VI http://standards.iso.org/ittf/PubliclyAvailableStandards/c042927_ISO_IEC_23271_2006%28E%29.zip
  • ISO 23272:2006 —信息技术—通用语言基础设施(CLI)—关于从分区 IV XML 文件导出的信息的技术报告 http://standards.iso.org/ittf/PubliclyAvailableStandards/c042928_ISO_IEC_TR_23272_2006%28E%29.zip
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 强制执行语句的顺序 的相关文章

随机推荐

  • Python 交互式 Shell - 带有 print 的 SyntaxError [重复]

    这个问题在这里已经有答案了 我是Python新手 我在 Windows 2003 虚拟机上安装了 Python 推出Python Shell 输入以下代码 print Hello World 它立即向我吐出以下内容 语法错误 语法无效 以下
  • 哈希表 v 自平衡搜索树

    我很想知道使用自平衡树技术来存储项目比使用哈希表更重要的推理是什么 我发现哈希表无法维护插入顺序 但我始终可以在顶部使用链表来存储插入顺序序列 我发现对于少量的值 哈希函数会增加成本 但我总是可以将哈希函数与密钥一起保存以加快查找速度 我知
  • 检测何时将文本输入到文本区域并相应地更改它

    我有一个textarea用户可以在其中输入或粘贴其他人的电子邮件地址 并在按 提交 按钮后向他们发送邀请 每封电子邮件必须用逗号分隔 并且在提交表单之前有效 验证由jQuery 验证插件 http jqueryvalidation org
  • “在‘​​vue’中找不到导出‘默认’(作为‘Vue’导入)

    我是 VueJs 的初学者 这是我的第一个应用程序 import BootstrapVue from bootstrap vue import createApp from vue import App from App vue const
  • “函数”对象没有属性“tk”是什么意思?

    我目前正在开发一个程序 可以让您注册一个帐户 然后通过将详细信息写入 txt 文档并再次读取它们来再次登录 一切都工作正常 直到我添加以下内容 def login fh open usernamepassword txt r lines f
  • 在 Swift 中过滤具有多个条件和类型的对象数组

    我正在尝试在我的应用程序中进行一些复杂的过滤 但我不知道下一步该做什么 我的数据由一个字典数组组成 其中每个字典中的值可以是String Int or String let person1 String Any first name Joh
  • Onload 使输入大小适合文本长度

    我试图让 jQuery 测试 onLoad 输入框中文本的长度 并更改输入框的大小以适应 这是迄今为止我的代码尝试 emailSubject attr size this val length 我收到以下错误 this val 不是函数 我
  • Zend_Validate_Float 语言环境不适用于 hi_IN 语言环境

    在使用 hi IN 进行数字验证时 我面临以下问题 其中 Zend Locale Format isFloat 对于非单个数字和任何语言环境都可以正常工作 但不适用于单位数字和区域设置 hi IN 源代码 测试用例 foreach arra
  • 有没有办法识别 c/c++ 库的版本?

    例如 如何获取 usr lib libz a的版本 如果可以获取其他有用的信息 例如编译器 架构等 那就太好了 我想知道这一点的原因是 当我编译程序并与特定版本的 libz 链接时 gcc 总是说它忽略了我在命令行中提供的 libz gcc
  • 覆盖 require.js 中的 setTimeout

    我们在项目中使用 require js 我们需要重写设置超时时间在第 705 行 这是我们需要的代码以某种方式忽略 省略这个 setTimeout 根本 我的意思是运行它 问题是 如果我在更改版本时显式地在开源代码中更改它 代码将丢失 我应
  • 将数组传递给存储过程

    我必须将数组和字符串传递给存储过程并返回数据表 C side public DataTable fetchRequested string empID string account string refNo string orgID str
  • 可以在 Coq 的蕴涵中使用 destruct 吗?

    destruct可以用来分割and or在柯克 不过好像也可以用暗示 例如我想证明 P gt P Lemma test P P gt P Proof unfold not intro pffpf apply pffpf intro pff
  • 如何自动填写XFA(PDF)表格?

    我正在寻找一个免费选项来填写 XFA PDF 表单 我知道 iText 是一个选择 但它们的商业价格对我来说太贵了 我更喜欢完全开源的东西 有 PDFBox 但它似乎不允许将数据插入 XFA 表单 或者至少很少解释如何插入 我只需要使用文本
  • Python字典查找性能,get vs in

    这并不是过早的优化 我的用例在内部循环的最里面对字典的权利进行了双重检查 一直运行 而且 它在智力上也令人厌烦 见结果 这些方法中哪一种更快 mydict hello yes goodbye no key hello A if key in
  • 对 BigIntegers 列表求和

    我已经查看了所有内容 但无法弄清楚这一点 如何对 BigIntegers 列表求和 Using System Numerics Using System Linq List
  • 具有多个组件的开盖

    我正在尝试将三个单元测试项目 三个不同的 dll 合并到一份 OpenCover 报告中 是否可以 我尝试查看过滤器 但在 OpenCover Wiki 站点中没有看到足够的详细信息 示例 有人可以告诉我可以从哪里开始吗 多谢 对的 这是可
  • 错误:无法初始化客户端 | mongo-connect 快速会话

    我在尝试在 mongodb 上保存会话时遇到错误 这是我的代码 const express require express const session require express session const MongoStore req
  • 与 gfortran 和 gcc 静态链接的混合语言

    我有一些用 C 和 Fortran 编写的代码 我想将其编译成静态链接的可执行文件 如果我动态编译代码 使用 fno underscoringgfortran 的选项 一切正常 但是 我想将其链接到 so文件中 静态链接大部分需要的库 然后
  • 从派生的可变参数模板类调用基模板的虚拟方法

    这本质上是后续之前的一个问题 https stackoverflow com q 26351963 315052 不是我提出的 但我对答案感兴趣 问题是 为什么编译器 链接器无法解析派生类对虚函数的调用 在这种情况下 派生类是具有可变参数的
  • C# 强制执行语句的顺序

    我的问题是关于 C 大概还有 Net 中的执行顺序保证 我给出了我所了解的 Java 示例来进行比较 对于Java 来自 Java并发实践 只要在该线程内无法检测到重新排序 就无法保证一个线程中的操作将按照程序给定的顺序执行 即使重新排序对