Thread就是Thread,需要自己排程,適合長跑型的操作。ThreadPool是Thread基礎上的一個執行緒池,目的是減少頻繁建立執行緒的開銷。執行緒很貴,要開新的stack,要增加CPU上下文切換,所以ThreadPool適合頻繁、短期執行的小操作。排程演算法是自適應的,會根據程式執行的模式調整配置,通常不需要自己排程執行緒。另外分為Worker和IO兩個池。IO執行緒對應Native的overlapped io,Win下利用IO完成埠實現非阻塞IO。Task或者說TPL是一個更上層的封裝,NB之處在於continuation。continuation的意義在於:高效能的程式通常都是跑在IO邊界或者UI事件的邊界上的,TPL的continuation可以更方便的寫這種高scalability的程式碼。Task會根據一些flag,比如是不是long-running來決定底層用Thread還是ThreadPool,另外也做了些細節最佳化,比如同一個執行緒跑好幾個Task,比如continuation時根據情況讓CPU空轉幾毫秒來等待前置Task結束,都是為了減少CPU上下文切換。結論:能用Task就用Task,底下都是用的Thread或者ThreadPool。但是要注意細節,比如告訴Task是不是long-running;比如儘量別Wait;再比如IO之後的continuation要儘快結束然後把執行緒還回去,有事開個Worker做,要不然會影響後面的IO,等等。另外還有個特別的是Timer,所有Timer例項都是在一個專門的Timer執行緒上排程的。所以不要寫的很重,要不然原本已經很低的精度會更加慘不忍睹。
Thread就是Thread,需要自己排程,適合長跑型的操作。ThreadPool是Thread基礎上的一個執行緒池,目的是減少頻繁建立執行緒的開銷。執行緒很貴,要開新的stack,要增加CPU上下文切換,所以ThreadPool適合頻繁、短期執行的小操作。排程演算法是自適應的,會根據程式執行的模式調整配置,通常不需要自己排程執行緒。另外分為Worker和IO兩個池。IO執行緒對應Native的overlapped io,Win下利用IO完成埠實現非阻塞IO。Task或者說TPL是一個更上層的封裝,NB之處在於continuation。continuation的意義在於:高效能的程式通常都是跑在IO邊界或者UI事件的邊界上的,TPL的continuation可以更方便的寫這種高scalability的程式碼。Task會根據一些flag,比如是不是long-running來決定底層用Thread還是ThreadPool,另外也做了些細節最佳化,比如同一個執行緒跑好幾個Task,比如continuation時根據情況讓CPU空轉幾毫秒來等待前置Task結束,都是為了減少CPU上下文切換。結論:能用Task就用Task,底下都是用的Thread或者ThreadPool。但是要注意細節,比如告訴Task是不是long-running;比如儘量別Wait;再比如IO之後的continuation要儘快結束然後把執行緒還回去,有事開個Worker做,要不然會影響後面的IO,等等。另外還有個特別的是Timer,所有Timer例項都是在一個專門的Timer執行緒上排程的。所以不要寫的很重,要不然原本已經很低的精度會更加慘不忍睹。