线程问题----线程争用(加锁)-创新互联
                                            如果在线程之间共享数据,则可能会出现线程争用的问题

1,局一个线程争用的例子:
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个任务,每个任务循环执行StateObject类的ChangeState方法
            for (int i = 0; i < 20; i++)
            {
                new Task(st.RaceCondition, so).Start();
            }
            Console.WriteLine("运行完成");
            Console.ReadLine();
        }
    }
    //简单的任务类
    class SampleTask
    {
        public void RaceCondition(object o)
        {
            Trace.Assert(o is StateObject, "只能传递StateObject对象");
            StateObject s = o as StateObject;
            int i = 0;
            //单个任务循环执行StateObject类的ChangeState方法
            while (true)
            {
                s.ChangeState(++i);
            }
        }
    }
    //状态类
    //如果state为5,则加1,后面跟着检查state,如果不为6,就出现了争用。
    class StateObject
    {
        int state = 5;
        public void ChangeState(int loop)
        {
            if (state == 5)
            {
                state++;
                //为false说明出现争用,则程序断言(弹出框)
                Trace.Assert(state == 6, "在循环了" + loop.ToString() + "次后出现了争用");
            }
            state = 5;
        }
    }
   
} 
2,解决办法:
①:使用lock锁定共享的s变量
    //简单的任务类
    class SampleTask
    {
        public void RaceCondition(object o)
        {
            Trace.Assert(o is StateObject, "只能传递StateObject对象");
            StateObject s = o as StateObject;
            
            int i = 0;
            //单个任务循环执行StateObject类的ChangeState方法
            while (true)
            {
                //使用lock锁定共享的s变量
                lock (s)
                {
                    s.ChangeState(++i);
                }
            }
        }
    }②:将共享对象设置为线程安全的对象
    //状态类
    //如果state为5,则加1,后面跟着检查state,如果不为6,就出现了争用。
    class StateObject
    {
        int state = 5;
        public void ChangeState(int loop)
        {
            //将共享对象设置为线程安全的对象
            lock (this)
            {
                if (state == 5)
                {
                    state++;
                    //为false说明出现争用,则程序断言(弹出框)
                    Trace.Assert(state == 6, "在循环了" + loop.ToString() + "次后出现了争用");
                }
                state = 5;
            }
        }
    }另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网站名称:线程问题----线程争用(加锁)-创新互联
路径分享:http://www.scyingshan.cn/article/idiis.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 