翻出了以前记录的笔记,基本涵盖了.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