C#-CLR note - 26线程
开篇 async/wait的使用
static async Task Main(string[] args)
{
Console.WriteLine("start-- ");
var task = Do();
task.Wait();
Console.WriteLine("end-- "+task.Result);
Console.ReadLine();
}
static async Task<string> Do()
{
await Task.Run(() =>
{
//The same to `Task.Delay().Wait();`
//Thread.Sleep(3000);
Task.Delay(2000).Wait();
Console.WriteLine("2000ms later.");
});
Console.WriteLine("Do end.");
return "ok";
}
【但是!!! Unity中以下卡死--访问了t】

【原因】方法ExecuteAsyn方法要开一个线程执行。因为Start方法访问t,一直等待异步方法的返回所以卡住.且对线程断点会卡死
https://zhuanlan.zhihu.com/p/86168785
26.2 线程开销
内存占用
线程内核对象
拥有线程描述属性与线程上下文,线程上下文占用的内存空间为 x86 架构 占用 700 字节、x64 架构 1240 字节 、ARM 架构 350 字节。线程环境块(TEB)
TEB 消耗一个内存页,占用 4KB内存。用户模式栈。
用户模式栈存储传递给方法的局部变量与实参,并且还存储有一个地址用于当前方法返回的时候,线程应该从哪个地方继续执行。默认 Windows 分配保留 1MB 内存。内核模式栈。
32 位 Windows 占用 12 KB,64 位 Windows 占用 24 KB。DLL 线程连接与线程分离通知。
上下文切换
任何时刻一个线程只分配一个CPU,只能运行一个“时间片”(也称“量”“量程”)的长度。时间片到期,就上下文切换到另一个线程。每次操作都有以下操作:
- 将 CPU 寄存器值存储在当前正在运行的线程的内核对象内部的上下文结构之中。
- 从先有线程集合选取一个线程供调度,如果该线程属于另一个进程,还得切换 CPU 能够操作的虚拟地址空间。
- 将上下文结构中的值加载到 CPU 寄存器之中。
26.8 线程调度和优先级
Windows是抢占式多线程操作系统。
线程可在任何时间被停止
不能确保线程在什么时候执行
线程的优先级0-31 (低到高)
//阻止调用线程,直到由该实例表示的线程终止。 thread.Join();
27.5 任务
- ThreadPool的QueueUserWorkItem这个技术有限制,不要用(不知道操作什么时候完成)。
总结
- 创建和销毁线程是昂贵的操作,如果从性能考虑:多少个cpu就多少个线程(因为上下文切换很耗; 另外,创建一个线程需要几秒的时间)
- 多线程的使用导致占用较多内存
- 因为windows侧重响应能力和多线程能力,牺牲开销来创建多线程()
- 线程执行完后,回收到线程池里。(线程池闲一定的时间之后销毁里边的线程)
使用async/await的原因
- Unity的Coroutine不好处理异常、堆栈信息不友好、只能返回IEnumerator不利于同步异步逻辑之间信息的交换。
C#-CLR note - 26线程的更多相关文章
- 线程系列06,通过CLR代码查看线程池及其线程
在"线程系列04,传递数据给线程,线程命名,线程异常处理,线程池"中,我们已经知道,每个进程都有一个线程池.可以通过TPL,ThreadPool.QueueUserWorkItem ...
- 《CLR Via C#》读书笔记:26.线程基础
一.线程开销 操作系统创建线程是有代价的,其主要开销在下面列举出来了. 内存开销 线程内核对象 拥有线程描述属性与线程上下文,线程上下文占用的内存空间为 x86 架构 占用 700 字节.x64 架构 ...
- CLR via C# 读书笔记-26.线程基础
前言 这俩个月没怎么写文章做记录分享,一直在忙项目上线的事情,但是学习这件事情,停下来就感觉难受,clr线程这章也是反复看了好多遍,书读百遍其义自见,今天我们来聊下线程基础 1.进程是什么,以及线程起 ...
- 读书笔记—CLR via C#线程27章节
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- CLR via C# 线程基础知识读书笔记
1.线程的开销 a.线程内核对象 b.线程环境块 c.用户模式栈(1MB) d.内核模式栈 f.DLL线程连接和线程分离通知 2.线程的优先级由进程优先级和线程优先级共同组成 3.进程中所有的前台线程 ...
- 读书笔记—CLR via C#线程25-26章节
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- java基础26 线程的通讯;wait()、notify()、notifyAll()等方法
线程的通讯:一个线程完成了自己的任务时,要通知另一个线程去完成另一个任务 1.1.方法 wait():等待.如果线程执行到了wait()方法,那么该线程会进入等待状态,等待状态下的线程必须要被其他线程 ...
- [CLR via C#]25. 线程基础
一.Windows为什么要支持线程 Microsoft设计OS内核时,他们决定在一个进程(process)中运行应用程序的每个实例.进程不过是应用程序的一个实例要使用的资源的一个集合.每个进程都赋予了 ...
- 线程机制、CLR线程池以及应用程序域
最近在总结多线程.CLR线程池以及TPL编程实践,重读一遍CLR via C#,比刚上班的时候收获还是很大的.还得要多读书,读好书,同时要多总结,多实践,把技术研究透,使用好. 话不多说,直接上博文吧 ...
随机推荐
- ios判断当前设备是否是ipad
+ (BOOL)getIsIpad { NSString *deviceType = [UIDevice currentDevice].model; if([deviceType isEqualToS ...
- mitmproxy的简单使用
第1则 ---抓包工具mitmdump的使用--- 一.什么是抓包?怎么抓包? 1.抓包(packet capture)就是将网络传输发送与接收的数据包进行截获.重发.编辑.转存等操作,也用来检查网络 ...
- Spark原始码系列(五)分布式缓存
问题导读:spark缓存是如何实现的?BlockManager与BlockManagerMaster的关系是什么? 这个persist方法是在RDD里面的,所以我们直接打开RDD这个类. def pe ...
- elasticsearch unassigned shards 导致RED解决
先通过命令查看节点的shard分配整体情况 curl -X GET "ip:9200/_cat/allocation?v" 说明:有16个索引未分片 2.查看未分片的索引 curl ...
- Spring系列.AOP原理简析
Spring AOP使用简介 Spring的两大核心功能是IOC和AOP.当我们使用Spring的AOP功能时是很方便的.只需要进行下面的配置即可. @Component @Aspect public ...
- Nginx 如何自定义变量?
之前的两篇文章 Nginx 变量介绍以及利用 Nginx 变量做防盗链 讲的是 Nginx 有哪些变量以及一个常见的应用.那么如此灵活的 Nginx 怎么能不支持自定义变量呢,今天的文章就来说一下自定 ...
- 安装mysql报错:遇到缺少vcruntime140_1.dll文件
把vcruntime140_1.dll文件放到System32 ,和System64就行 文件地址为:C:\Windows\System32 直接百度下载放进去就行
- 729. My Calendar I
原题链接:https://leetcode.com/problems/my-calendar-i/description/ 我的答案 虽然自己实现出来了,但是没看懂这道题目考查的是什么?编程语言的熟练 ...
- weblogic之高级进阶JMS的应用
不仅Activemq提供的jms服务,Weblogic也提供了jms服务,很多项目是部署在Weblogic中,使用其提供的jms服务也是很多企业的选择,一直没亲手试过,今天试了下,遇到的小问题还挺多, ...
- Redis:rdb和aof
由于redis的数据都直接存储在内存里,在服务器发生宕机时内存的数据会瞬间清空,那么必须要有重启时恢复数据的方法. redis通过持久化机制将数据存储到磁盘中从而在服务器重启时恢复数据,这篇文章主要简 ...