在 C# 中重现小数点的撕裂读取

2023-12-20

眼见为实。任何人都可以重现读取撕裂的小数的程序吗?我尝试旋转多个线程,在 1 和 2 之间更改相同的小数。我没有捕获任何与 1 或 2 不同的读取。

我希望看到读取器线程看不到写入器线程的原子更改,因此该值应该与 1 或 2 不同。

void TornDecimalReadTest()
{
    decimal sharedDecimal = 1;
    int threadCount = 100;
    var threads = new List<Thread>();

    for (int i = 0; i < threadCount; i++)
    {
        int threadId = i;
        var thread = new Thread(() =>
        {
            Thread.Sleep(5000);

            decimal newValue = threadId % 2 == 0 ? 1 : 2;
            bool isWriterThread = threadId % 2 == 0;

            Console.WriteLine("Writer : " + isWriterThread +
                " - will set value " + newValue);

            for (int j = 0; j < 1000000; j++)
            {
                if (isWriterThread)
                    sharedDecimal = newValue;

                decimal decimalRead = sharedDecimal;

                if (decimalRead != 1 && decimalRead != 2)
                    Console.WriteLine(decimalRead);
            }
        });

        threads.Add(thread);
    }

    threads.ForEach(x => x.Start());
    threads.ForEach(x => x.Join());
}

这段代码将展示一个撕裂的阅读Decimal:

using System;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        void run()
        {
            Task.Run((Action) setter);
            Task.Run((Action) checker);

            Console.WriteLine("Press <ENTER> to stop");
            Console.ReadLine();
        }

        void setter()
        {
            while (true)
            {
                d = VALUE1;
                d = VALUE2;
            }
        }

        void checker()
        {
            for (int count = 0;; ++count)
            {
                var t = d;

                if (t != VALUE1 && t != VALUE2)
                    Console.WriteLine("Value is torn after {0} iterations: {1}", count, t);
            }
        }

        static void Main()
        {
            new Program().run();
        }

        Decimal d;

        const Decimal VALUE1 = 1m;
        const Decimal VALUE2 = 10000000000m;
    }
}

它在发布版本中比在调试版本中发生得更快。

我认为您在测试代码中没有看到撕裂读取的原因是因为您只更改了 0 和 1 之间的值。测试期间更改的位很可能都在用于存储的同一个字中内部的值,并且对单词的访问是原子的。

通过更改 1 到 10000000000 之间的值,我们强制在两个不同的字中更改位,从而可以观察到撕裂的读取。

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

在 C# 中重现小数点的撕裂读取 的相关文章

随机推荐

  • 使用顶点/像素着色器进行通用计算(Open GL / DirectX)

    我有一个关于计算着色器的问题 DX 9 中提供计算着色器吗 如果 GPU 上没有计算着色器片段 是否仍然可以使用带有 DX9 驱动程序的计算着色器 SGX 545 没有 但 SGX 6X 一代将会有 据 IMG 所说 我想知道我是否可以使用
  • 根据属性中的值显示/隐藏多个 div

    我之前问过这个问题 但我想也许我措辞不正确 我得到的答案是如何在单击按钮时显示 隐藏一组 div 我明白如何做到这一点 然而我的问题有点不同 这次我试图提出一个更详尽的问题 我有一堆显示图像的 div div div
  • Eclipse C printf() 失败

    我刚刚安装了用于 c 的 Eclipse 但遇到了问题printf 功能 我的代码应该以打印 给出号码 开始 但事实并非如此 如果我输入 4 这就是我得到的 4 Give the number I am number 1 I am numb
  • 记录语法:验证构造函数中的内容

    我有一个包含 12 个值的记录 有一些值的组合无效 因此我希望构造函数检查这一点 我只知道如何创建接受参数列表的构造函数 但是对于 12 个值来说这并不是很漂亮 因此 我想在构造值后使用该值时使用记录语法 如何在构造函数中强制执行约束并仍然
  • 如何提高 MySQL 转储恢复的性能

    我们中的许多人在处理家庭或宠物项目以及使用数据库存储结构化数据时可能会在尝试转储 恢复数据时遇到性能问题 坐等另一个转储恢复操作几十分钟甚至几个小时可能会很烦人 我有非常典型的机器规格 4 核 i5 7300 8 Gb RAM 相当快的 M
  • Asp.net Core Linq 查询花费太多时间

    我有一个 linq 查询 需要 31 秒 这是我第一次收到这么晚的询问 我不知道该怎么办 让我向您展示我的查询 public IEnumerable
  • 打开相机胶卷上的精确照片

    我正在开发一个相机应用程序 我想在其中添加一些已存在于库存应用程序中的功能 我的问题是复制左下角的小方块 纵向模式 其中显示用户刚刚拍摄的照片的微缩略图 然后 当用户点击它时 照片应用程序应该在相机胶卷中保存的最后一张照片上打开 我可以使用
  • 如果它是外部链接,如何将 rel = "nofollow" 添加到 CKEditor 中的链接

    我想给rel nofollow 到我的外部链接 其内容由 ckeditor 管理 example com 我的网站 externallink com 任何外部链接 例如 p Lorem a href https example com an
  • 在 Windows 上为 Ant 设置 Java 路径

    刚刚下载了最新版本的 Ant 并安装在 C apache ant 1 8 4 我将以下内容添加到环境路径变量中 C apache ant 1 8 4 bin 当我打开终端窗口并键入 ant version I get Files Java
  • 使用 Microsoft Visual Studio Code 进行 Java 编程

    I downloaded language support for Java by Red Hat in Microsoft Visual Studio Code 但我遇到了如上图所示的问题 所以我尝试在中设置我的JDK路径settings
  • 在 Ruby 中从文本文件中提取选定的数据

    现在我正在用 Ruby 从文本文件中提取信息 那么如何从以下文本文件中提取数字 0 6748984055823062 sentiment analysis positive sentiment Popular topic games sco
  • 如何在 Vue.js 中动态构建路由器链接?

    我正在尝试在 Vue js 中执行以下操作 table tr td td tr table
  • C# linq 联合问题

    有人可以解释一下怎么做吗Union在 LINQ 工作中 据说它合并了两个序列并且删除重复项 但是我可以以某种方式自定义重复删除行为吗 假设我希望使用来自the second sequence如果有重复或来自the first sequenc
  • 绘图中的自定义离散色阶

    我想自定义颜色plotly阴谋 这对于连续变量和尺度来说效果很好docs https plot ly r user guide sequential color mappings library plotly plot ly iris x
  • natbib 似乎无法与 pdf_book / rticles 正常工作

    在我的 Rmd 文件中 我引用 bib 文件中的位置如下 让我引用一篇文章 SampleTitle2016 当我 编织当前 时 我想要 tex 文件 其中对文章的引用由 cite citep 或 citet 命令提供 我注意到 如果我在输出
  • 我可以本地化 UIDatePicker 吗?

    我正在尝试本地化 UIDatePicker 苹果的文档说它应该自动检测当前的区域设置 但无论我选择哪种语言 语言都保持不变 我需要做什么 区域设置属性 以及与此相关的所有其他国家 地区特定格式属性 默认为由返回的值当前区域设置 http d
  • 从 s3 读取 .pptx 文件

    我尝试从 Amazon S3 打开 pptx 并使用 python pptx 库读取它 这是代码 from pptx import Presentation import boto3 s3 boto3 resource s3 obj s3
  • 如果我使用 UTF-8 字符集,是否需要对特殊字符使用 HTML 实体?

    我正在开发的一个网站正在从 ISO 切换过来 如果HTML字符集设置为UTF 8 还需要替换吗 等与适当的 HTML 实体 不 像这样的符号 德语元音变音 使用 UTF 8 时 所有其他内容都可以像任何其他字符一样使用 但请注意 有些东西仍
  • 允许强制转换为 void(不是指针),为什么?

    为什么我可以将此向量转换为 void 甚至不是指针 int main std vector
  • 在 C# 中重现小数点的撕裂读取

    眼见为实 任何人都可以重现读取撕裂的小数的程序吗 我尝试旋转多个线程 在 1 和 2 之间更改相同的小数 我没有捕获任何与 1 或 2 不同的读取 我希望看到读取器线程看不到写入器线程的原子更改 因此该值应该与 1 或 2 不同 void