溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

線程問題----線程爭(zhēng)用(加鎖)

發(fā)布時(shí)間:2020-08-04 07:53:23 來源:網(wǎng)絡(luò) 閱讀:372 作者:1473348968 欄目:編程語言

如果在線程之間共享數(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;
        }
    }
   
}

 

 線程問題----線程爭(zhēng)用(加鎖)

 

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;
            }
        }
    }

 

向AI問一下細(xì)節(jié)

免責(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)容。

AI