C# 证明指令重排

简介: C# 证明指令重排

using System;
using System.Threading;

public class TestInterlocak
{
    private int x = 0, y = 0, a = 0, b = 0;
    int count = 0;
    public void Exec()
    {
        while(true) 
        {
            //所有变量全部恢复初始值
            a = 0;
            b = 0;
            x = 0;
            y = 0;
             //计数加1
            count++;
            CountdownEvent countdownEvent  = new CountdownEvent(2);
            ThreadPool.SetMaxThreads(5, 100);
            ThreadPool.QueueUserWorkItem((state)=>{
                 a = 1;
                 y = b;
                countdownEvent.Signal();
            });
            ThreadPool.QueueUserWorkItem((state)=>{
                b = 1;
                x = a;
                countdownEvent.Signal();
            });
            countdownEvent.Wait();
            //此时,上面的两个线程已经执行完毕。如果代码在执行过程中都是
            //一行一行的代码顺序执行的,那么上面两个线程无论是怎样的先后执行
            //顺序,a=1和b=1,这两句代码作为第一行代码,总有一句是最先执行的,
            //也就是说,到最后x或y肯定都不为0。如果到最后x和y都同时为0了,那
            //么根据反证法原理,代码在执行过程中,有可能并不绝对按照代码
            //顺序依次执行,当然也就发生了指令重排,代码执行中存在指令重排
            //的情况也就得到了证明

            //如果x和y都等于0了,就输出结果(如果Java代码真的按照顺序一句一句
            //执行的话,是绝对不可能出现x和y同时为0的)
            if (x == 0 && y == 0) 
            {
                //指令重排输出语句
                String message = "第" + count + "次出现指令重排,x=" + x + ",y=" + y;
                //打印,证明完毕
                System.Console.Error.WriteLine(message);
                //结束程序
                break;
            }
            Thread.Sleep(200);
        }
    }
}
目录
相关文章
|
7月前
|
编译器 C# 开发者
C# 10.0中的全局`using`指令:简化命名空间引用的新方式
【1月更文挑战第4天】本文介绍了C# 10.0中引入的全局`using`指令,该指令允许开发者在项目级别统一管理命名空间引用,从而消除源文件中重复的`using`语句。全局`using`指令通过减少冗余代码、提高可维护性和统一命名空间管理,为开发者带来了更高效的编码体验。文章详细解释了如何实现全局`using`指令,并探讨了其在实际项目中的优势和适用场景。
|
4月前
|
编译器 C#
C# 预处理指令
C# 预处理指令
25 0
|
6月前
|
编译器 C# C++
【.NET Core】C#预处理器指令
【.NET Core】C#预处理器指令
81 1
|
6月前
|
C#
C# 命名空间和 using 指令详解
C# 命名空间和 using 指令详解
|
编译器 C# C++
C#——预处理器指令
C#——预处理器指令
125 0
|
编译器 C# C++
☀️ 学会编程入门必备 C# 最基础知识介绍(六)——接口、命名空间、预处理指令、正则表达式、异常处理、文件的输入与输出
前言👻 接口(interface)🎉 定义接口: MyInterface.cs 接口继承: InterfaceInheritance.cs C# 命名空间(Namespace)🎈 定义命名空间 using 关键字 嵌套命名空间 C# 预处理器指令🎄 C# 预处理器指令列表 #define 预处理器 条件指令 C# 正则表达式🔔 定义正则表达式 C# 异常处理🎃 语法 C# 中的异常类 异常处理 创建用户自定义异常 抛出对象 C# 文件的输入与输出⛄️ C# I/O 类 FileStream 类 C# 高级文件操作
☀️ 学会编程入门必备 C# 最基础知识介绍(六)——接口、命名空间、预处理指令、正则表达式、异常处理、文件的输入与输出
|
C#
一起谈.NET技术,C#中使用#region指令的一些想法
  这篇文章我将不会去介绍如何使用#region指令。因为每个C#开发人员都应该见过和使用过#region指令的。这篇文章将讨论如何在代码中正确的使用它。使用#region就是将一些有关联的代码组织在一起,然后折叠起来。
1103 0