C# 中对 volatile 变量的赋值

2023-12-20

我对 C# 的理解(感谢 Jeff Richter 和 Jon Skeet)认为赋值是“原子的”。不同的是,当我们混合读取和写入(递增/递减)时,因此我们需要在互锁上使用方法。如果只有读取和分配,这两个操作都是原子操作吗?

public class Xyz
{
    private volatile int _lastValue;
    private IList<int> AvailableValues { get; set; }
    private object syncRoot = new object();
    private Random random = new Random();

    //Accessible by multiple threads
    public int GetNextValue() //and return last value once store is exhausted
    {
        //...

        var count = 0;
        var returnValue = 0;

        lock (syncRoot)
        {
            count = AvailableValues.Count;
        }

        if (count == 0)
        {
            //Read... without locking... potential multiple reads
            returnValue = _lastValue;
        }
        else
        {

            var toReturn = random.Next(0, count);

            lock (syncRoot)
            {
                returnValue = AvailableValues[toReturn];
                AvailableValues.RemoveAt(toReturn);
            }
            //potential multiple writes... last writer wins
            _lastValue = returnValue;
         }

        return returnValue;

    }

我对 C# 的理解是(感谢 杰夫·里克特和乔恩·斯基特) 分配是“原子的”。

一般来说,赋值不是原子的。C# 规范仔细地指出了保证原子性的内容。参见第 5.5 节:

以下数据类型的读取和写入是原子的:bool、char、byte、sbyte、short、ushort、uint、int、float 和引用类型。此外,对具有前面列表中的基础类型的枚举类型的读取和写入也是原子的。其他类型(包括 long、ulong、double、decimal 以及用户定义类型)的读写不保证是原子的.

(强调是添加的。)

如果只有读取和分配这两个操作都是原子操作吗?

5.5 节再次回答了你的问题:

不保证原子读-修改-写

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中对 volatile 变量的赋值 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 在搜索 List 时,为什么 Enumerable.Any(Func predicate) 比带有 if 语句的 foreach 慢

    最近有件事引起了我的好奇心 Why is the Enumerable Any Func
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没

随机推荐

  • 无法连接到 docker 的 docker 镜像中的守护进程 docker

    我正在尝试使用 gitlab 构建 CI 我从 docker 的 docker 镜像开始 我的前端存储库没有任何问题 但现在后端使用相同的 gitlab ci 配置文件 我遇到了这个守护进程错误 这是构建的输出 0KRunning with
  • 图像叠加闪烁?

    事实是所有这些解决方案都有效 只是不适用于该项目 所以我将重新提出问题 略有不同 本质上我有一个图像 当有人将鼠标光标移到它上面时 它会显示一个 div 其中包含一个图像 又名播放按钮 当他们将光标移动到图像之外时 播放按钮就会消失 它有效
  • 是否可以在 Excel VBA 中返回复选框的名称?

    我目前正在处理几个包含数百个复选框的工作表 这些复选框背后的代码工作正常 但我正在寻找一种方法来列出每列复选框的名称 即 例如 我需要知道 G 列中所有复选框的名称 有谁知道这是否可能 预先非常感谢 考虑使用 TopLeftCell 属性
  • 可数对象和不可数对象有什么区别

    我正在尝试找出可数和不可数对象之间的差异 首先我找到了对象的类型 echo gettype data current fiat currency 这是一个Object 但是当我检查它是否是一个可数对象时 var dump data curr
  • 获取 Google 折线图的颜色值?

    可以为 Google 图表设置颜色值 但是是否可以获取图表的预设颜色值 是否有一个数组可以保存这些值并可以访问 在此 Google 网上论坛讨论中 默认颜色数组未记录且无法访问 但是 如果您想要颜色数组 泽维尔 古马拉 https grou
  • VBA:具有多个操作的单行 if 语句

    我真的应该能够用谷歌搜索这个 但我找不到我想知道的东西 我想检查文件是否存在 如果没有 将弹出一个消息框 并且 VBA 应退出子进程 If Dir C file txt vbDirectory Then MsgBox File doesn
  • 为什么 Spark ML ALS 算法打印 RMSE = NaN?

    我使用 ALS 来预测评级 这是我的代码 val als new ALS setMaxIter 5 setRegParam 0 01 setUserCol user id setItemCol business id setRatingCo
  • 无法检索 write() 的 AudioTrack 指针

    我正在尝试实现 AudioTrack 以在 Android 设备中检索来自 IAX 的来电音频 但一段时间后遇到异常 private void writeBuff short buf try if this track null Log w
  • “长轮询”是创建 Web 实时应用程序的最有效方法吗?

    我想创建一个像这样的应用程序 http collabedit com http collabedit com 创建这个实时应用程序的最有效方法是什么 闪光 长轮询 Http 流式传输 或者是其他东西 谢谢 目前 长轮询可能是最好的解决方案
  • Office 365 Sharepoint 将文件上传到文档库

    我正在尝试使用以下代码通过 Web 服务将文件添加到 Sharepoint Office365 上的文档库 public void SaveFileToSharePoint string fileName try var copyServi
  • 如何使用 cli 获取帐户的接近余额?

    是否有可能使用接近帐户余额靠近 cli https docs near org docs tools near cli Running near state
  • 使用 Ansible 在 Windows 上执行 .exe

    我们想要在带有 Ansible 1 8 2 的 Windows Server 2012 上部署应用程序 我已经搜索并找到了a list http docs ansible com list of windows modules htmlWi
  • 如何在视图外评估 Aurelia 插值表达式?

    在 Aurelia 中 假设我有一个包含插值表达式的字符串 Today at value date time 和一些代表绑定上下文的对象 value new Date 有没有办法在视图之外只获取该字符串和该对象 并获取结果格式化字符串 即
  • 如何修复错误消息:“chromedriver.exe”可执行文件可能具有错误的权限[重复]

    这个问题在这里已经有答案了 我正在安装 selenium 的网络驱动程序 但是我收到以下错误 PermissionError Traceback most recent call last usr local lib python3 6 d
  • 排除 Twitter 流中的回复 - tweepy

    我正在使用 tweepy 从 Twitter 的流 api 中提取推文 然后我用它来自动回复该用户 例如 如果我想从中提取实时推文然后回复唐纳德 特朗普 我可以使用 import tweepy from tweepy import Stre
  • 在 Apache Kafka 中,为什么消费者实例不能多于分区?

    我正在学习卡夫卡 阅读这里的介绍部分 https kafka apache org documentation html introduction https kafka apache org documentation html intr
  • Android EditText 以编程方式调整大小

    我有一个视图 其中有两个 LinearLayout 一个包含文本 EditText 和一个按钮 另一个仅包含文本和 EditText 我试图让第二个 EditText 在第二行 的宽 度与第一行的宽度相匹配 我尝试将其设为 TableLay
  • 将数据帧转换为 JSON 时删除空数组字段

    有没有什么方法可以通过不使用那些为空的字段来从 Spark 数据帧创建 json 假设我有一个数据框 name hit songs beatles help hey jude romeo eres mia juliet null 我想将其转
  • 解析 TSV 文件

    我需要解析 TSV 格式的文件 制表符分隔值 我使用正则表达式将文件分解为每一行 但我找不到令人满意的正则表达式来解析每一行 现在我已经提出了这个
  • C# 中对 volatile 变量的赋值

    我对 C 的理解 感谢 Jeff Richter 和 Jon Skeet 认为赋值是 原子的 不同的是 当我们混合读取和写入 递增 递减 时 因此我们需要在互锁上使用方法 如果只有读取和分配 这两个操作都是原子操作吗 public clas