<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Lock Free ObjectPool<T>的C#實現 (對象池)

      最近實現了一個LockFree的對象池

      主要的想法是:

        1.復用構造出來的對象
        2.避免重復創建和銷毀對象對GC造成的壓力

        3.避免重復創建對象造成的資源消耗

      最適合的場景是:

        1.構造對象很慢,并且需要構造很多個對象的情況

      主要技術特征:

        1. C#4.0的實現(可以降級到2.0)

        2. 內部沒有使用普通的lock,而是使用Lock Free的實現方式

        3. 將常用的取回對象的方式,換成委托運行, 這樣的話ObjectPool可以幫你自動將對象壓回隊列

        4. ObjectPool支持對象池上下限的設置(如果移除該功能性能還會提高很多!)

      以下是實現代碼:

          /// <summary>
      /// 對象池 (有上下限的版本..如果不要控制上限的話性還能好很多)
      /// </summary>
      /// <typeparam name="T"></typeparam>
      public sealed class ObjectPool<T>
      {
      #region private Fields 為了調試方便 吧一些變量弄成了Public, 實際使用中請關掉
      private int isTaked = 0;
      private Queue<T> queue = new Queue<T>();
      private Func<T> func = null;
      private int currentResource = 0;
      public int tryNewObject = 0;
      private int minSize = 0;
      private int maxSize = 0;
      #endregion

      #region private methods
      private void Enter()
      {
      while (Interlocked.Exchange(ref isTaked, 1) != 0)
      {
      }
      }
      private void Leave()
      {
      Thread.VolatileWrite(ref isTaked, 0);
      }
      #endregion

      /// <summary>
      /// 構造一個對象池
      /// </summary>
      /// <param name="func">用來初始化對象的函數</param>
      /// <param name="minSize">對象池下限</param>
      /// <param name="maxSize">對象池上限</param>
      public ObjectPool(Func<T> func, int minSize = 1, int maxSize = 5)
      {
      if (func == null)
      {
      throw new ArgumentNullException("func");
      }
      if (minSize < 0)
      {
      throw new ArgumentOutOfRangeException("minSize");
      }
      if (maxSize < 0)
      {
      throw new ArgumentOutOfRangeException("maxSize");
      }
      if (maxSize < minSize)
      {
      throw new ArgumentException("maxSize can not be less than minSize");
      }

      this.minSize = minSize;
      this.maxSize = maxSize;
      for (int i = 0; i < minSize; i++)
      {
      this.queue.Enqueue(func());
      }

      this.currentResource = minSize;
      this.tryNewObject = minSize;
      this.func = func;
      }

      /// <summary>
      /// 從對象池中取一個對象出來,并執行, 執行完成以后會自動將對象放回池中
      /// </summary>
      /// <param name="action">一個可用的對象</param>
      public void Run(Action<T> action)
      {
      if (action == null)
      {
      throw new ArgumentNullException("func");
      }
      T t = default(T);
      try
      {
      Start:
      if (Interlocked.Decrement(ref this.currentResource) < 0)
      {
      if (this.tryNewObject < this.maxSize)
      {
      Interlocked.Increment(ref this.tryNewObject);
      t = func();
      Interlocked.Increment(ref this.currentResource);
      }
      else
      {
      Interlocked.Increment(ref this.currentResource);
      goto Start;
      }
      }
      else
      {
      this.Enter();
      t = this.queue.Dequeue();
      this.Leave();
      }

      action(t);
      }
      finally
      {
      this.Enter();
      this.queue.Enqueue(t);
      this.Leave();
      Interlocked.Increment(ref currentResource);
      }
      }

      /// <summary>
      /// 看看現在的Queue中有多少個資源,線程不安全...
      /// </summary>
      [Obsolete]
      public int ResourceCountInQueue { get { return queue.Count(); } }
      }



      測試代碼如下:(注意測試代碼是4.0的)

             static void Main(string[] args)
      {
      //測試代碼
      int length = 1 * 1000 * 1000;
      Stopwatch sw = Stopwatch.StartNew();
      ObjectPool<MD5> pool = new ObjectPool<MD5>(() =>
      {
      Thread.Sleep(1000);//模擬緩慢的構造情況
      return new MD5CryptoServiceProvider();
      });

      Parallel.For(0, length, p =>
      {
      pool.Run(md5 =>
      {
      md5.ComputeHash(Guid.NewGuid().ToByteArray());//模擬一個運算場景
      });
      });
      sw.Stop();
      Console.WriteLine(sw.ElapsedMilliseconds);
      Console.WriteLine(length);
      Console.WriteLine(pool.ResourceCountInQueue);
      }

       

      順便測試一下機器性能...這個代碼在我機器上大約要跑10秒鐘......- -#

       

      歡迎大家指正~

      posted on 2012-03-16 22:22  聽說讀寫  閱讀(3734)  評論(5)    收藏  舉報

      導航

      主站蜘蛛池模板: 日韩不卡在线观看视频不卡| 九九综合va免费看| 国产成人精品午夜2022| 日韩有码中文在线观看| 青青青国产在线观看免费| 怡春院久久国语视频免费| 热久久美女精品天天吊色| 激情综合五月网| 韩国无码AV片午夜福利| 国产良妇出轨视频在线观看| 亚洲一区二区三区在线播放无码 | jk白丝喷浆| 午夜免费视频国产在线| 国精品无码人妻一区二区三区| 国模在线视频一区二区三区| 唐人社导航福利精品| 久草热在线视频免费播放| 少妇粗大进出白浆嘿嘿视频| 正镶白旗| 久久一日本综合色鬼综合色| 国产精品成人一区二区三区| 国内精品无码一区二区三区| 国产一区二区三区色老头| 成熟少妇XXXXX高清视频| 日本无人区一区二区三区| 国产福利在线观看免费第一福利| 777奇米四色成人影视色区| 性做久久久久久久久| 亚洲国产精品嫩草影院久久| 国产高颜值不卡一区二区| 中文成人无字幕乱码精品区| 国产亚洲精品第一综合麻豆 | 免费黄色大全一区二区三区| 中文字幕无码免费久久| 激情综合网激情五月伊人| 亚洲av日韩av综合在线观看| 万安县| 国产毛片基地| 亚洲精品天天影视综合网 | 老司机亚洲精品一区二区| 免费无码午夜福利片|