翻出了之前记录的笔记,基本涵盖了.NET中线程和异步的相关概念。可以提供一个学习的方向。

线程类型

工作者线程
IO线程

线程池

全局队列(QueueUserWorkItem、Timer总是放入全局)
本地队列

工作者线程调度流程

如果本地队列有任务,则调度本地队列
如果本地队列没有任务则去其它工作者线程中调度
如果所有工作者线程本地队列都没有任务则去全局队列取任务调度
如果全局队列也没有任务则睡眠等待
如果睡眠了太长时间则自己醒来销毁自己

从全局队列取到本地队列采用 FIFO 算法
从本地队列取出时,采用 LIFO 算法
子任务、嵌套任务会被分配在线程的局部队列中

线程的开销

上下文切换

数据

AsyncLocal
ThreadLocal
ExecutionContext
SynchronizationContext(抽象的内容,基于ExecutionContext)

参考资料

https://blogs.msdn.microsoft.com/pfxteam/2012/06/15/executioncontext-vs-synchronizationcontext/

http://stackoverflow.com/questions/9562836/whats-the-meaning-of-usetaskfriendlysynchronizationcontext

https://msdn.microsoft.com/en-us/magazine/gg598924.aspx

Timer

所有的Timer只有一个线程,调度具体任务时使用线程池
避免重复执行,使用Change方法

伪共享

因为不同的内核访问一个内核的cache发生的问题 [StructLayout(LayoutKind.Explicit)] [FieldOffset(64)]

异步模型

APM(异步编程模型)

BeginXXX、EndXXX

HTTP(RFC 2616) 客户端应用程序到一个服务器的并发连接数不应超过2个。
FCL强制了这个规则,除非重新指定"ServicePointManager.DefaultConnectionLimit"

FileStream

指定 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

Task优势

  1. 任务使用的内存比线程少的多,创建和销毁所需的时间也少的多(复用线程)

  2. 线程池根据可用CPU数量自动伸缩任务规模
  3. 每个任务完成一个阶段后,运行的任务线程回到线程池,以便在那里接受新任务
  4. 线程池是站在整个进程的高度观察任务,所以,它能更好的调度这些任务,减少进程中的线程数,并减少上下文切换

.NET中的线程与异步(笔记)的更多相关文章

  1. android中的线程池学习笔记

    阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...

  2. Android笔记(二十九) Android中的异步更新(一) Android中的线程

    Java中的线程 1. 线程的两种实现方式 ①继承Thread类 ②实现Runnable接口 两者区别在于,Thread这个类的对象,代表的是一个线程,而Runnable的对象,代表的是线程体(也就是 ...

  3. C#中的线程一(委托中的异步)

    C#中的线程一(委托中的异步) 一.同步委托 我们平时所用的委托以同步居多,我们编写一个方法和相关委托进行演示: publicdelegatevoid DoSomethingDelegate(stri ...

  4. 并发王者课 - 青铜 2:峡谷笔记 - 简单认识Java中的线程

    在前面的<兵分三路:如何创建多线程>文章中,我们已经通过Thread和Runnable直观地了解如何在Java中创建一个线程,相信你已经有了一定的体感.在本篇文章中,我们将基于前面的示例代 ...

  5. springboot 中如何正确在异步线程中使用request

    起因: 有后端同事反馈在异步线程中获取了request中的参数,然后下一个请求是get请求的话,发现会偶尔出现参数丢失的问题. 示例代码: @GetMapping("/getParams&q ...

  6. Android多线程编程<一>Android中启动子线程的方法

          我们知道在Android中,要更新UI只能在UI主线程去更新,而不允许在子线程直接去操作UI,但是很多时候,很多耗时的工作都交给子线程去实现,当子线程执行完这些耗时的工作后,我们希望去修改 ...

  7. {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器

    Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...

  8. rxjava源码中的线程知识

    rxjava源码中的线程知识 rx的最精简的总结就是:异步 这里说一下以下的五个类 1.Future2.ConcurrentLinkedQueue3.volatile关键字4.AtomicRefere ...

  9. C#中的线程(一)入门

    文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari,  翻译 Swanky Wu 中文翻译作者把原文放在了& ...

随机推荐

  1. PAT乙级 1034

    思路:是个水题,但是有坑.不能被题目忽悠了,题目保证正确的输出中没有超过整型范围的整数. 它只是保证结果不超出int,但是我们在运算过程中的乘法可能会超出int,直接把所有int改成long long ...

  2. HDU - 1248 寒冰王座 数学or暴力枚举

    思路: 1.暴力枚举每种面值的张数,将可以花光的钱记录下来.每次判断n是否能够用光,能则输出0,不能则向更少金额寻找是否有能够花光的.时间复杂度O(n) 2.350 = 200 + 150,买350的 ...

  3. hexo持续更新记录

    port:50187

  4. Zookeeper笔记1-CAP/BASE理论

    分布式系统八大谬论: 1.网络相当可靠 2.延迟为0 3.传输带宽是无限的 4.网络相当安全. 5.拓扑结构不会改变 6.必须要有一名管理员 7.传输成本为0 8.网络同质化. 分布式最常出现的问题: ...

  5. Luogu P1522 牛的旅行 Cow Tours

    题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...

  6. 转:客户端session与服务端session

    会话(Session)跟踪是Web程序中常用的技术,用来 跟踪用户的整个会话 .常用的会话跟踪技术是Cookie与Session. Cookie通过在客户端记录信息确定用户身份 , Session通过 ...

  7. SpringMVC的标签库

            Spring2.0版本开始后,提供了一组功能强大的标签用来在JSP和SpringWebMVC中处理表单元素 ,可以用来访问控制器处理命令对象和绑定数据:         以下是表单标签 ...

  8. Linux基础四

    vim编辑器 vi编辑器的增强版,语法高亮等扩展功能 vim三种工作模式  a,i,o等键输出模式 命令模式,输入模式,末行模式 模式间的切换 a:当前行插入 i:当前行插入 o:全新一行插入 :键末 ...

  9. R语言︱非结构化数据处理神器——rlist包

    本文作者:任坤,厦门大学王亚南经济研究院金融硕士生,研究兴趣为计算统计和金融量化交易,pipeR,learnR,rlist等项目的作者. 近年来,非关系型数据逐渐获得了更广泛的关注和使用.下面分别列举 ...

  10. FusionCharts多数据验证饼图label是否重叠

    昨天,有人问我一个问题:由于饼图的数据太多,label标签上的汉字过多,导致重叠,该怎么解决? 今天我用大量的数据,label标签的字符也很多,但是通过验证没有发现有重叠的情况啊! 1.验证的JSP页 ...