您好,登錄后才能下訂單哦!
如果在線程之間共享數(shù)據(jù),則可能會(huì)出現(xiàn)線程爭(zhēng)用的問題
1,局一個(gè)線程爭(zhēng)用的例子:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace ConsoleApplication6 { class Program { static void Main(string[] args) { SampleTask st = new SampleTask(); StateObject so = new StateObject(); //開啟20個(gè)任務(wù),每個(gè)任務(wù)循環(huán)執(zhí)行StateObject類的ChangeState方法 for (int i = 0; i < 20; i++) { new Task(st.RaceCondition, so).Start(); } Console.WriteLine("運(yùn)行完成"); Console.ReadLine(); } } //簡(jiǎn)單的任務(wù)類 class SampleTask { public void RaceCondition(object o) { Trace.Assert(o is StateObject, "只能傳遞StateObject對(duì)象"); StateObject s = o as StateObject; int i = 0; //單個(gè)任務(wù)循環(huán)執(zhí)行StateObject類的ChangeState方法 while (true) { s.ChangeState(++i); } } } //狀態(tài)類 //如果state為5,則加1,后面跟著檢查state,如果不為6,就出現(xiàn)了爭(zhēng)用。 class StateObject { int state = 5; public void ChangeState(int loop) { if (state == 5) { state++; //為false說明出現(xiàn)爭(zhēng)用,則程序斷言(彈出框) Trace.Assert(state == 6, "在循環(huán)了" + loop.ToString() + "次后出現(xiàn)了爭(zhēng)用"); } state = 5; } } }
2,解決辦法:
①:使用lock鎖定共享的s變量
//簡(jiǎn)單的任務(wù)類 class SampleTask { public void RaceCondition(object o) { Trace.Assert(o is StateObject, "只能傳遞StateObject對(duì)象"); StateObject s = o as StateObject; int i = 0; //單個(gè)任務(wù)循環(huán)執(zhí)行StateObject類的ChangeState方法 while (true) { //使用lock鎖定共享的s變量 lock (s) { s.ChangeState(++i); } } } }
②:將共享對(duì)象設(shè)置為線程安全的對(duì)象
//狀態(tài)類 //如果state為5,則加1,后面跟著檢查state,如果不為6,就出現(xiàn)了爭(zhēng)用。 class StateObject { int state = 5; public void ChangeState(int loop) { //將共享對(duì)象設(shè)置為線程安全的對(duì)象 lock (this) { if (state == 5) { state++; //為false說明出現(xiàn)爭(zhēng)用,則程序斷言(彈出框) Trace.Assert(state == 6, "在循環(huán)了" + loop.ToString() + "次后出現(xiàn)了爭(zhēng)用"); } state = 5; } } }
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。