C# 多线程读写小实例 输出判断异常 求帮忙 新人

C# 多线程读写小实例 输出判断错误 求帮忙 新人
       下面功能主要是对属性OnPingCount的读写操作,一线程读,一线程写,可是在ShowValue()里本应是对的,怎么又输出来了,求帮忙是哪边出了问题,感激不尽啊!!!!


 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public Int32 mu32OnPingCount = 35767;    

        public bool mbRun = true;

        public Int32 OnPingCount
        {

            get { return mu32OnPingCount; }

            set { Interlocked.Exchange(ref mu32OnPingCount, value); }

        }

        //读
        public void ShowValue()
        {
            while (mbRun)
            {
             
                 if (OnPingCount !=35766 && OnPingCount!=35767)
                 {
                     Console.WriteLine(OnPingCount);
                 }
                 
            }
        }

        public void Ping2()
        {
            while (mbRun)
            {
                OnPingCount =35766;                
            }
        }

        public void Ping35767()
        {
            while (mbRun)
            {
                OnPingCount = 35767;
            }
        }
     
        public void Form1_Load(object sender, EventArgs e)
        {
            run();         
        }

        public void run()
        { 
            //创建新线程
            ThreadStart WTStart = new ThreadStart(Ping35767);
            Thread WriteThread = new Thread(WTStart);

            //创建新线程2
            ThreadStart WTStart2 = new ThreadStart(Ping2);
            Thread WriteThread2 = new Thread(WTStart2);

            WriteThread.Start();
            WriteThread2.Start();

            ShowValue();

        }  
    }


------解决思路----------------------
又可能是这样的:

当值为35767的时候,进行判断OnPingCount !=35766,返回为true,
然后进行下个表达式判断的时候,值被其他线程修改为35766,进行判断OnPingCount !=35767,返回true,
so 输出  35766,当然,可能在这时又被修改。。。


------解决思路----------------------
你可以骗自己,但是你骗不了编译器
你必须明确的告诉编译器,哪个过程和哪个过程不能2个线程同时执行,必须等待

sp1234对锁头的比喻其实我觉得不是很恰当
应该这样说:如果房间没有门的话(只有门框),那么所有人都可以随时进出
我需要同一时间只能有一个人在里面,那么就要有个门,而且要上锁,先进去的把门锁住,后面的人就只能排队了

而你是保留了一个敞开的大门的同时,在旁边的墙上又开了个小门,然后在小门上上了锁,你以为自己进去,然后把门锁上,别人就进不来了吗?