using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics ; using System.Threading ; namespace 多线程 { class 竞态问题演示 { public static void Main() { StateObject state = new StateObject() ; //启动20条线程,共享操作state对象 for( int i = 0 ; i < 20 ; i ++ ) { Thread t = new Thread( new SampleThread().RaceCondition ) ; t.Name = i.ToString() ; t.Start( state ) ; } //通过结果可以看出,不等于6的情况出现了,这个频率是不定的。 //原因就是在一个线程执行了if( state == 5 )之后,没来得及向下执行,被别的线程抢到了控制权。 //等再次轮到这个线程时,state已经变成了7,所以就出现了竞态问题。。用断言来显示 } } class StateObject { private int state = 5 ; public void ChangeState( int loop ) { if( state == 5 ) { state ++ ; //如果值不是6时,就要执行断言显示 Trace.Assert( state == 6 , "结果不为6,出现在" + loop + "次 线程名字:" + Thread.CurrentThread.Name ) ; } state = 5 ; } } class SampleThread { public void RaceCondition( object o ) { Trace.Assert( o is StateObject , "传入的必须是StateObject类型的参数" ); StateObject state = o as StateObject ; int i = 0 ; while( true ) { state.ChangeState( i ++ ) ; } } } }