.NET中的线程与异步(笔记)
翻出了之前记录的笔记,基本涵盖了.NET中线程和异步的相关概念。可以提供一个学习的方向。
线程类型
工作者线程
IO线程
线程池
全局队列(QueueUserWorkItem、Timer总是放入全局)
本地队列
工作者线程调度流程
如果本地队列有任务,则调度本地队列
如果本地队列没有任务则去其它工作者线程中调度
如果所有工作者线程本地队列都没有任务则去全局队列取任务调度
如果全局队列也没有任务则睡眠等待
如果睡眠了太长时间则自己醒来销毁自己
从全局队列取到本地队列采用 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
所有的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优势
- 任务使用的内存比线程少的多,创建和销毁所需的时间也少的多(复用线程)
- 线程池根据可用CPU数量自动伸缩任务规模
- 每个任务完成一个阶段后,运行的任务线程回到线程池,以便在那里接受新任务
- 线程池是站在整个进程的高度观察任务,所以,它能更好的调度这些任务,减少进程中的线程数,并减少上下文切换
.NET中的线程与异步(笔记)的更多相关文章
- android中的线程池学习笔记
阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...
- Android笔记(二十九) Android中的异步更新(一) Android中的线程
Java中的线程 1. 线程的两种实现方式 ①继承Thread类 ②实现Runnable接口 两者区别在于,Thread这个类的对象,代表的是一个线程,而Runnable的对象,代表的是线程体(也就是 ...
- C#中的线程一(委托中的异步)
C#中的线程一(委托中的异步) 一.同步委托 我们平时所用的委托以同步居多,我们编写一个方法和相关委托进行演示: publicdelegatevoid DoSomethingDelegate(stri ...
- 并发王者课 - 青铜 2:峡谷笔记 - 简单认识Java中的线程
在前面的<兵分三路:如何创建多线程>文章中,我们已经通过Thread和Runnable直观地了解如何在Java中创建一个线程,相信你已经有了一定的体感.在本篇文章中,我们将基于前面的示例代 ...
- springboot 中如何正确在异步线程中使用request
起因: 有后端同事反馈在异步线程中获取了request中的参数,然后下一个请求是get请求的话,发现会偶尔出现参数丢失的问题. 示例代码: @GetMapping("/getParams&q ...
- Android多线程编程<一>Android中启动子线程的方法
我们知道在Android中,要更新UI只能在UI主线程去更新,而不允许在子线程直接去操作UI,但是很多时候,很多耗时的工作都交给子线程去实现,当子线程执行完这些耗时的工作后,我们希望去修改 ...
- {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器
Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...
- rxjava源码中的线程知识
rxjava源码中的线程知识 rx的最精简的总结就是:异步 这里说一下以下的五个类 1.Future2.ConcurrentLinkedQueue3.volatile关键字4.AtomicRefere ...
- C#中的线程(一)入门
文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari, 翻译 Swanky Wu 中文翻译作者把原文放在了& ...
随机推荐
- 织梦去除tag标签url中的问号
找到文件 include\taglib\tag.lib.php 大概87行 把 $row['link'] = $cfg_cmsurl."/tags.php?/".urlencod ...
- Chrome Stylist 插件 (CSS备份)
Stylist 插件还是很好用的,可以给网站自定义CSS样式,(还有个插件叫"油猴子",可以给网页加载自定义JS): 不过麻烦的是,现在的最新版360浏览器不能显示这个插件(这个浏 ...
- Jenkins +git +python 进行持续集成进行接口测试(接口测试jenkins持续集成篇)
使用jenkins+git+python脚本进行持续集成的接口测试,在jenkins平台,利用插件等,把管理代码的git仓库的代码更新下来进行持续接口测试,python进行开发测试脚本,git进行远程 ...
- Redis常见七种使用场景(PHP实战)
edis 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 本篇文章,主要介绍利用Redis常见应用场景下PHP实战. ...
- AVFoundation 框架初探究(四)
叨叨两句 动手写这篇总结时候也是二月底过完年回来上班了,又开始新的一年了,今年会是什么样子?这问题可能得年底再回答自己了.在家窝了那么久,上班还是的接着看我们要看的东西,毕竟我们要做的事还真的太多的. ...
- Nginx和php是怎么通信的?
先来看一下搭建好PHP运行环境的Nginx配置文件. 非常重要的就是 fastcgi_pass 指令了,这个指令用于指定 fpm 进程监听的地址,Nginx 会把所有的 php 请求翻译成 fastc ...
- CodeForces - 796C Bank Hacking
思路:共有n-1条边连接n个点,即形成一棵树.一开始需要选择一个点hack--将这个点视为根结点,与它相邻的点防御值加1,与它相隔一个在线点的点的防御也加1.当根节点被hack,即这个点被删除,又变成 ...
- 求第k小的数 O(n)复杂度
思路:利用快速排序的思想,把数组递归划分成两部分.设划分为x,数组左边是小于等于x,右边大于x.关键在于寻找一个最优的划分,经过 Blum . Floyd . Pratt . Rivest . Tar ...
- Linux socket网络编程基础 tcp和udp
Socket TCP网络通信编程 首先,服务器端需要做以下准备工作: (1)调用socket()函数.建立socket对象,指定通信协议. (2)调用bind()函数.将创建的socket对象与当前主 ...
- bash文件的详细解读
一.bash的分类 1. 按生效范围分类 全局生效 /etc/profile /etc/profile.d/*.sh /etc/bashrc 个人用户生效 ~/.bash_profile ~/.bas ...