使用ThreadPool代替Thread

線程的空間開銷函數

  1. 線程內核對象。包含上下文信息。32位系統佔用700字節
  2. 線程環境塊。包括線程的異常處理鏈。32位系統佔用4KB
  3. 用戶模式棧。保存方法的參數、局部變量和返回值
  4. 內核模式棧。調用操做系統的內核模式函數時,系統會將函數參數從用戶模式棧複製到內核模式棧。32位系統佔用12KB

線程的時間開銷spa

  1. 建立時,系統相繼初始化上述內存空間
  2. CLR加載DLL到DLLMain方法,並傳送鏈接標誌
  3. 線程上下文切換
    1. 進入內核模式
    2. 將上下文信息保存到正在執行的線程內核對象上
    3. 系統獲取一個Spinlock,並肯定下一個要執行的線程。釋放Spinlock。若是下一個線程不在同一個進程,則須要進行虛擬地址交換
    4. 從將被執行的線程內核對象上載入上下文信息
    5. 離開內核模式

使用線程池,CLR不會銷燬這個線程,而是會保留這個線程一段時間。操作系統

using System;
using System.Diagnostics;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var p = new Program();
            Stopwatch sw = new Stopwatch();
            sw.Start();
            p.Thread();
            sw.Stop();
            Console.WriteLine(sw.ElapsedTicks);
            sw.Restart();
            p.Pool();
            sw.Stop();
            Console.WriteLine(sw.ElapsedTicks);
            Console.ReadKey();            
        }

        void Thread()
        {
            for (int i = 0; i < 10; i++)
            {
                var worker = new Thread(() =>
                {
                    //Console.WriteLine("Thread Do");
                });
                worker.Start();
            }
        }

        void Pool()
        {
            for (int i = 0; i < 10; i++)
            {
                ThreadPool.QueueUserWorkItem(state =>
                {
                    //Console.WriteLine("Pool Do");
                });
            }
        }
    }
}
相關文章
相關標籤/搜索