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);
        }
    }
}
目录
相关文章
|
4月前
|
编译器 C++
理解内存序,指令重排与内存模型
理解内存序,指令重排与内存模型
46 0
|
10天前
|
IDE 编译器 C语言
【C++】使用g++指令控制【翻译】各个过程
【C++】使用g++指令控制【翻译】各个过程
|
4月前
|
Java 编译器 程序员
【面试问题】什么是指令重排?
【1月更文挑战第27天】【面试问题】什么是指令重排?
|
5月前
|
存储 Java 索引
探索CPU的黑盒子:解密指令执行的秘密
本文深入探讨了CPU执行指令的相关知识,包括CPU内部的寄存器组成、程序计数器的作用、函数调用机制以及CPU指令执行的五个阶段。通过学习这些内容,读者可以进一步了解计算机的工作原理。
探索CPU的黑盒子:解密指令执行的秘密
|
12月前
|
存储 小程序 C语言
条件分支和循环机制、标志寄存器及函数调用机制
条件分支和循环机制、标志寄存器及函数调用机制
68 0
西门子S7-1200移动指令编程实例,移动和块移动指令、填充指令、交换 指令的作用是什么?
西门子S7-1200的移动指令包括移动和块移动指令、填充指令、交换指令。
西门子S7-1200移动指令编程实例,移动和块移动指令、填充指令、交换 指令的作用是什么?
|
C语言 Perl