网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

线程问题----线程争用(加锁)

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

在惠阳等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站设计、网站制作 网站设计制作按需网站开发,公司网站建设,企业网站建设,品牌网站制作,全网营销推广,成都外贸网站建设,惠阳网站建设费用合理。

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

 


文章题目:线程问题----线程争用(加锁)
文章起源:http://bjjierui.cn/article/jihpcs.html

其他资讯