信号灯 ManualResetEvent 与 Interlocked.Increment 原子操作使

Posted LarvaAndQing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了信号灯 ManualResetEvent 与 Interlocked.Increment 原子操作使相关的知识,希望对你有一定的参考价值。

class Program

    {


        public static int numb = 0;

        public static int numbb = 100;

        static ManualResetEvent manu = new ManualResetEvent(false);

        static void Main(string[] args)

        {

            

            for (int i = 0; i < numbb; i++)

            {

                ThreadPool.QueueUserWorkItem(new WaitCallback(ok), i);

             

             }

          


           //等待事件的完成,即线程调用ManualResetEvent.Set()方法

            //eventX.WaitOne  阻止当前线程,直到当前 WaitHandle 收到信号为止。


            manu.WaitOne(Timeout.Infinite,true);

            Console.WriteLine("全部收到信息,完成任务.计数器:{0}",numb);

        }

        public static  void ok(object x)

        {

           

            for (int i = 0; i < 10; i++)

            {

                Console.WriteLine("位置<{0}>,线程ID:<{1}>", i, Thread.CurrentThread.ManagedThreadId);

            }



            Interlocked.Increment(ref numb);


            if (numb==numbb)

            {

                manu.Set(); //将事件状态设置为终止状态,允许一个或多个等待线程继续。

            }

        }

      

    }

 

以上是关于信号灯 ManualResetEvent 与 Interlocked.Increment 原子操作使的主要内容,如果未能解决你的问题,请参考以下文章

C#AutoResetEvent和ManualResetEvent的区别

Thread.Yield 与 WaitOne

如何使用ThreadPool

转载5天不再惧怕多线程——第四天 信号量

信号量

C#ThreadCountdownEvent任务并行