旗下导航:搜·么
当前位置:网站首页 > .Net教程 > 正文

C# 线程同步与线程池 浅析【C#.Net教程】,C#,线程同步,线程池

作者:搜教程发布时间:2019-11-27分类:.Net教程浏览:40评论:0


导读:C#线程同步与线程池示例很简单,预备5个线程,每一个线程同时向控制台输出数字,然后视察输出效果。代码申明:////线程列表privatestaticLi...
C# 线程同步与线程池

示例很简单,预备5个线程,每一个线程同时向控制台输出数字,然后视察输出效果。

代码申明:

////线程列表

private static List<Thread> _threadList;
 
 
        static voidMain(string[] args)
        {
            Program._threadList= new List<Thread>();
            ////附加5个线程
            for (inti = 0; i < 5; i++)
            {
                Program.AppendThread();
            }
 
            ////最先实行一切测试线程
            Program.ExecuteThread();
 
            ////按任意键退出
            Console.ReadLine();
        }
 
        /// <summary>
        /// 将新的测试线程附加到测试线程列表,线程实行逻辑就是输出10个数字
/// 注重初始化的时刻设置为背景线程了,如许可以保证主线程退出的时刻其他线/// 程自动退出
        /// </summary>
        public staticvoid AppendThread()
        {
            Program._threadList.Add(newThread(new ThreadStart(
                () =>
                {
                   for (int i = 0; i < 10; i++)
                   {
                       Console.WriteLine(i);
                   }
                })){ IsBackground = true });
        }
 
        /// <summary>
        /// 最先实行一切测试线程
        /// </summary>
        public staticvoid ExecuteThread()
        {
            foreach(Thread t in _threadList)
            {
                t.Start();
            }
        }

视察实行效果,我们可以看到效果以下:

依据效果(数字的输出是不规律的)可知,线程之间发生了滋扰。战略就是,加一个同步成员来举行线程同步:

   /// <summary>
        /// 多线程同步的对象
        /// </summary>
        private static object _syncObj = new object();
别的,在线程实行的处所加锁:
Program._threadList.Add(newThread(new ThreadStart(
                () =>
                {
                    lock (_syncObj)
                    {
                        for (int i = 0; i < 10;i++)
                        {
                            Console.WriteLine(i);
                        }
                    }
 
                })) { IsBackground = true });

视察效果:

可以看到经由过程Lock关键字,对一个多线程同步的变量加锁确实可以使得线程同步。

如今看一下第二种体式格局:

运用monitor关键字举行同步,代码:

Monitor.Enter(_syncObj);
                   try
                   {
                       for (int i = 0; i < 10; i++)
                       {
                            Console.WriteLine(i);
                       }
                   }
                   finally {
                       Monitor.Exit(_syncObj);
                   }

检察效果,会发明线程已同步了。

第三种体式格局:

如今让我们重构一下代码,新建一个ThreadManager的类,把类的职责都搬进去:

class ThreadManager
    {
        /// <summary>
        /// 线程列表
        /// </summary>
        private staticList<Thread> _threadList;
 
        staticThreadManager()
        {
           _threadList = new List<Thread>();
        }
 
        /// <summary>
        /// 附加新线程
        /// </summary>
        public staticvoid AppendThread()
        {
            ThreadManager._threadList.Add(newThread(new ThreadStart(
                () =>
                {
                   for (int i = 0; i < 10; i++)
                   {
                       Console.WriteLine(i);
                   }
 
                })){ IsBackground = true });
        }
 
        /// <summary>
        /// 最先实行一切线程
        /// </summary>
        public staticvoid ExecuteThread()
        {
            foreach(Thread t in _threadList)
            {
                t.Start();
            }
        }
    }

Main函数挪用的代码做响应的转变:

static voidMain(string[] args)
        {
            ////附加5个线程
            for (int i = 0; i < 5; i++)
            {
                ThreadManager.AppendThread();
            }
 
            ////最先测试
            ThreadManager.ExecuteThread();
 
            ////按任意键继承
            Console.ReadLine();
        }

因为没有对线程同步做任何处置惩罚,效果一定可以猜到,线程是不同步的:

如今对ThreadManager这个类加上特征:[Synchronization],再次运转之,发明线程同步了,这就是线程同步的第四种计划,用起来很简单,然则起首它请求实行逻辑都放在一个类中,因为它可以确保这个类中的一切要领都是线程平安的,因而它的机能相对低效

线程同步另有要领吗?答案是一定的,那就是第四种要领—线程池。

如今来看一下如何用线程池来完成:

  static void Main(string[]args)
        {
/////定义一个waitCallback对象,并定义它的行动,就是向控制台输出十个数字同时可以通报/////一个参数(这个参数是可选的)
                       WaitCallback work = new WaitCallback((o)=>
            {
                for(int i = 0; i < 10; i++)
                {
                   Console.WriteLine(i);
                }
            });
 
            ////实行5次
            for (inti = 0; i < 5; i++)
            {
/////假如这里须要通报参数,可以挪用另一个重载要领
                ThreadPool.QueueUserWorkItem(work);
            }
 
            ////按任意键继承
            Console.ReadLine();
        }

如许就完成了方才的逻辑吗?是的,运转以后我们可以看到效果,线程是同步的。

多线程还带来了哪些优点?

  • 线程池减少了线程建立、最先和住手的次数,从而提高了效力;

  • 运用线程池,可以使我们将注重力放到营业逻辑上而不是多线程架构上(然而在某些状况应优先运用手工线程治理)

  • 假如须要前台线程或许设置优先级别,或许线程池中的线程老是背景线程,且他的优先级是默许的;

  • 假如须要一个带有牢固标识的线程便于退出,挂起或经由过程名字发明它。

以上就是C# 线程同步与线程池 浅析的内容,更多相关内容请关注ki4网(www.ki4.cn)!

标签:C#线程同步线程池


欢迎 发表评论: