- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个简单的(希望是)问题,我一直无法找到答案 -
假设我有多个线程可以访问的对象 a、b。
Interlocked.Exchange(ref a, b)
如果“b”不是 volatile 的,这个操作会这样对待它吗?即它会从内存中获取这个变量的最新值吗?如果是这样,那是用写读“原子”吗?我知道 Interlocked.Exchange 的主要目的是您将获得 'a' 的先前值作为新写入的原子操作。但我的主要困惑在于“b”的值实际写入了“a”。
我的第二个问题与这篇文章中的一句话有关:
http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/
“一个有趣的点是,根据此处和此处记录的内存模型,C# 中的所有写入都是 volatile 的,并且大概也是这样实现的。C# 语言的 ECMA 规范实际上定义了一个较弱的模型,其中写入不是默认情况下是易变的。”
这是真的吗?如果是这样,如果不关心“a”的先前值,是否存在 Interlocked.Exchange 的目的? (关于我的第一个例子)。我没有在 StackOverflow 上看到关于每次写入都不稳定的任何其他文章或评论。但是,我知道写入是原子的。
编辑:如果我的第一个问题的答案是“b”不被视为易变的,而我的第二个问题的答案是写入确实是易变的,那么后续问题是,interlocked.exhange 何时有用,如果我们不关心 'a' 的先前值?
最佳答案
传递给 Exchange
的变量(或传递给任何方法的任何 volatile 变量)在传递时不保留“波动性”......实际上没有必要让它成为 volatile
(在方法调用期间)因为 volatile
唯一做的就是确保编译器不优化变量的使用(这通常意味着优化写入寄存器因此该值只能由单个处理器“看到”)。在 x86/x64 以外的处理器上,这有时意味着保证获取或释放语义的指令。 .NET 不使用寄存器来传递参数,因此 volatile 不会影响传递的参数的“波动性”。由于内存模型的可见性保证,它必须始终从内存中获取最新值
RE 问题 2:引用“有点”是真的,这取决于字段的声明,有可见性保证 w.r.t.字段;但如果没有“ volatile ”字段访问,则可以在某些使用阶段将其优化为寄存器,从而可能对其他处理器隐藏某些写入。
Interlocked
交换使不是原子的操作看起来是原子的。交换本质上类似于:
var x = someVariable;
someVariable = y;
无论 someVariable
的类型如何,这都不能是原子的。 Exchange
使此操作成为原子操作。对于 double
、long
(32 位)等非原子类型,这也是原子的。
Exchange
为实现原子性所做的部分工作是使用内存栅栏——这使得写入可见,并且不会与内存之后的指令序列中相同内存地址的读取重新排序围栏。
如果您不关心“a”的先前值,为什么要使用 Exchange
?如果您不关心实际的“交换”,那么 VolatileWrite
似乎更合适。
或者,如果不需要“exchange”,您可以编写线程安全代码来为“A=B”建模,如下所示:
Thread.MemoryBarrier();
A=B;
FWIW,Interlocked
是部分围绕某些处理器中的比较和交换 (CAS) 指令建模的。这些指令允许您在一条指令中执行这两个操作(使其成为原子)。如果没有像 Interlocked
这样的东西,编译器可能很难推断出应该使用这些 CAS 指令之一。此外,Interlocked
在不支持这些 CAS 指令(以及其他可能的非原子指令,如 inc 和 dec——可能并非在所有处理器上都可用)的处理器上提供原子用法
关于c# - Interlocked.Exchange 说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13013555/
有没有办法使用 EWS Managed API 搜索 Exchange 以查找所有文件夹中的所有电子邮件。我正在使用 FindItems API 调用——但这似乎要求将搜索限制在单个文件夹中。
我已经看到这个问题被问了好几次,但到目前为止,答案都非常机械化和令人失望: EWS 与 EAS 有什么区别? 现在,大多数网站都给出以下内容:“一个是移动设备协议(protocol),另一个是 Web
我们将 Exchange 集成到我们的 CRM(日记和电子邮件)中;我们通过 SQL 2008 服务器中的 CRL 函数完成了这项工作,这些函数处理所有身份验证以及与 Exchange 2007 We
我想为交换服务器创建插件。 Exchange 服务器是否为此提供任何 SDK。如果有人知道,请告诉我。 最佳答案 此链接应为您提供可用内容的概览。 https://msdn.microsoft.com
我刚开始使用EWS(Exchange Web服务),并且正在寻找一个简单的示例,该示例演示如何发送带有附件的电子邮件。我搜索了一个示例,但找不到简单明了的示例。我找到了有关如何发送电子邮件但不发送带有
我在一个客户站点工作,并通过网络邮件连接到他们的 Exchange 2000 服务器。我正在运行 Outlook 2007,并通过 HTTP 连接到我的公司 Exchange 2007。 是否有任何方
从 Exchange 2007 开始,安装 Exchange 时不再安装 MAPI。在这些系统上 this install如果您想使用 MAPI,则除 Exchange 外还需要。 我的软件依赖于 E
交换 2010。 我已经阅读了有关 Exchange 中的通知订阅、邮箱事件和 EWS 的信息,据我所知,通知客户端应用程序必须始终与 EWS 保持连接。我对吗? 我的任务看起来很简单 - 当消息到达
我试图弄清楚节流政策如何影响 EWS。 对于 EWS,我们有以下值: EWSMaxSubscription:模拟用户完成的事件订阅数。 EWSMaxConcurrency:单个客户端可能执行的并发连接
我在 Exchange 2010 SP2 服务器上使用 EWS 我似乎找不到任何命令/文档来检索交换服务器中所有用户(邮箱/别名)的完整列表 这个问题已经问了好几次了,但我还没有看到任何答案 谢谢 最
我正在使用 CalendarItemType View 来检索日历项目。我唯一关心的项目是我创建的项目,我知道它们都是每周重复出现的项目。我能够获取每个单独的事件,并从其中任何一个中获取重复出现的主项
我从 Exchange 2007 服务器的地址开始: user@domain.exchangeserver.org 我尝试发送自动发现请求,如 MSDN 中所述. 我尝试使用 TechNet Whit
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 12 年前。 Improve thi
这是我所拥有的... 我有一个跟踪条形码类型标签的程序。我可以在数据库中选择一个项目并为它打印一个标签。我正在添加向我们的 Exchange 服务器 (2007 SP1) 上的特定收件箱发送电子邮件并
我的公司正在开发一个桌面和移动电子邮件客户端的项目,该客户端可以连接到不同的邮件服务器,用户或服务器管理员只需进行最少的配置。我们希望能够支持 Exchange,但经过一些研究后我意识到有许多问题需要
我正在尝试调用 GetUserAvailabilityRequest 来自不遵守夏令时的南非标准时间,但是,TimeZone 元素需要 StandardTime 和 DaylightTime 子元素,
我想在我的交换服务器上收到电子邮件时运行脚本。我真的没有关于如何实现这一点的好方向。我已经用 VB 编写了脚本并在 outlook 上对其进行了测试。我错误地认为您可以像在 Outlook 中一样从
我在使用 Exchange 2010 Web 服务 (EWS) 创建全天事件约会时遇到了麻烦。 根据现有要求,创建全天事件约会对象需要指定开始和结束时间(即 10/20/2011 12:00:00 A
是否有任何公共(public) Exchange 服务器(模拟器)可用于测试/试验我的 Exchange Web 服务实现? 最佳答案 我怀疑没有免费的东西。创建自己的 VM 会容易得多。您将需要具有
我正在尝试使用最新的 Exchange Web 服务 DLL,但是当我搜索我的硬盘时,我看到了许多版本的 Microsoft.Exchange.WebServices.DLL,最新的是版本 14.0.
我是一名优秀的程序员,十分优秀!