如果在线程之间共享数据,则可能会出现线程争用的问题

1,局一个线程争用的例子:

usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnostics;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Threading;namespaceConsoleApplication6{classProgram{staticvoidMain(string[]args){SampleTaskst=newSampleTask();StateObjectso=newStateObject();//开启20个任务,每个任务循环执行StateObject类的ChangeState方法for(inti=0;i<20;i++){newTask(st.RaceCondition,so).Start();}Console.WriteLine("运行完成");Console.ReadLine();}}//简单的任务类classSampleTask{publicvoidRaceCondition(objecto){Trace.Assert(oisStateObject,"只能传递StateObject对象");StateObjects=oasStateObject;inti=0;//单个任务循环执行StateObject类的ChangeState方法while(true){s.ChangeState(++i);}}}//状态类//如果state为5,则加1,后面跟着检查state,如果不为6,就出现了争用。classStateObject{intstate=5;publicvoidChangeState(intloop){if(state==5){state++;//为false说明出现争用,则程序断言(弹出框)Trace.Assert(state==6,"在循环了"+loop.ToString()+"次后出现了争用");}state=5;}}}

2,解决办法:

①:使用lock锁定共享的s变量

//简单的任务类classSampleTask{publicvoidRaceCondition(objecto){Trace.Assert(oisStateObject,"只能传递StateObject对象");StateObjects=oasStateObject;inti=0;//单个任务循环执行StateObject类的ChangeState方法while(true){//使用lock锁定共享的s变量lock(s){s.ChangeState(++i);}}}}

②:将共享对象设置为线程安全的对象

//状态类//如果state为5,则加1,后面跟着检查state,如果不为6,就出现了争用。classStateObject{intstate=5;publicvoidChangeState(intloop){//将共享对象设置为线程安全的对象lock(this){if(state==5){state++;//为false说明出现争用,则程序断言(弹出框)Trace.Assert(state==6,"在循环了"+loop.ToString()+"次后出现了争用");}state=5;}}}