Loading

自旋

 

  SpinWait结构:自旋意味着让一个线程暂时“原地等待” 。线程会一直运行占用CPU。自旋适用于多核计算机。只阻塞极短的时间段,小任务场景里。自旋并不会一直占用CPU,如果自旋的时间过长,会自动释放占用的CPU。SpinWait结构提供了NextSpinWillYield属性。当其值为真时,调用SpinOnce方法自旋会退出占用的CPU。

     static volatile bool isCompleted = false;

        static void SpinWaitTest()
        {
            var m = new SpinWait();
            while (!isCompleted)
            {
                Console.WriteLine(m.NextSpinWillYield);
                m.SpinOnce();
              
            }
            Console.WriteLine("Waiting spin is complete");
        }
        static void Main(string[] args)
        {
            var t2 = new Thread(SpinWaitTest);
            isCompleted = false;
            Console.WriteLine("spin running");
            t2.Start();
            Thread.Sleep(10000);
            isCompleted = true;
            Console.Read();
        }

 

可以看到CPU只有短时间的升高就回落了自旋已经让出了CPU。

      

 

public class InitPools
{
      private int Excuting= 0;

      public void AllocT()
        {
          ThreadPool.QueueUserWorkItem(w => Excuated());
           if(Excuting==1)
            {
                  var spinWait = new SpinWait();

                while (true)
                {
                    spinWait.SpinOnce();
                    if (Excuting!= 1)
                        AllocT();
                 }
            }else AllocT();
         }

      public void Excuated()
      {
            if (Interlocked.CompareExchange(ref _inExpanding, 1, 0) != 0)
                return false;
Doing(); Excuting=0; } }

  

   

posted @ 2017-12-28 09:14  奔跑石头  阅读(89)  评论(0)    收藏  举报