线程问题----线程争用(加锁)
如果在线程之间共享数据,则可能会出现线程争用的问题
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;}}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。