翻出了以前記錄的筆記,基本涵蓋了.NET中線程和異步的相關概念。能夠提供一個學習的方向。算法
工做者線程
IO線程編程
全局隊列(QueueUserWorkItem、Timer老是放入全局)
本地隊列windows
若是本地隊列有任務,則調度本地隊列
若是本地隊列沒有任務則去其它工做者線程中調度
若是全部工做者線程本地隊列都沒有任務則去全局隊列取任務調度
若是全局隊列也沒有任務則睡眠等待
若是睡眠了太長時間則本身醒來銷燬本身安全
從全局隊列取到本地隊列採用 FIFO 算法
從本地隊列取出時,採用 LIFO 算法
子任務、嵌套任務會被分配在線程的局部隊列中服務器
AsyncLocal
ThreadLocal
ExecutionContext
SynchronizationContext(抽象的內容,基於ExecutionContext)多線程
https://blogs.msdn.microsoft.com/pfxteam/2012/06/15/executioncontext-vs-synchronizationcontext/併發
https://msdn.microsoft.com/en-us/magazine/gg598924.aspx異步編程
全部的Timer只有一個線程,調度具體任務時使用線程池
避免重複執行,使用Change方法學習
由於不一樣的內核訪問一個內核的cache發生的問題 [StructLayout(LayoutKind.Explicit)] [FieldOffset(64)]
BeginXXX、EndXXX
HTTP(RFC 2616) 客戶端應用程序到一個服務器的併發鏈接數不該超過2個。
FCL強制了這個規則,除非從新指定"ServicePointManager.DefaultConnectionLimit"
指定 FileOptions.Asynchronous 儘可能使用 BeginRead,不然儘可能使用Read章節:27.8.8
FCL法則
靜態方法保證線程安全
實例方法不保證
在硬件中發生
線程將一直在cpu上運行,稱做「活鎖」
在操做系統中發生
windows會堵塞線程使它再也不浪費cpu時間
線程將一直堵塞,稱做「死鎖」
windows操做系統檢測不到一個線程在一個基元用戶模式中構造上堵塞了。因此線程池不會建立一個新的線程來替換這種臨時堵塞。
活鎖浪費cpu時間和內存,死鎖只浪費內存 同時使用稱做:混合模式構造
它包含一個簡單的數據類型的變量上執行原子性的讀或寫操做
它包含一個簡單的數據類型的變量上執行原子性的讀和寫操做
相關FCL類型
1.Interlocked
2.SpinWait
3.SpinLock
相關FCL類型
WaitHandle
EventWaitHandle
AutoResetEvent
ManualResetEvent
Semaphore
Mutex
相關FCL類型
ManualResetEventSlim
SemaphoreSlim
CountdownEvent(與SemaphoreSlim相反) Monitor
Barrier(多線程協調)
lock Monitor