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#,比刚上班的时候收获还是很大的.还得要多读书,读好书,同时要多总结,多实践,把技术研究透,使用好. 话不多说,直接上博文吧 ...
随机推荐
- Hive和HBase整合用户指南
本文讲解的Hive和HBase整合意思是使用Hive读取Hbase中的数据.我们可以使用HQL语句在HBase表上进行查询.插入操作:甚至是进行Join和Union等复杂查询.此功能是从Hive 0. ...
- 数据库整理(三) SQL基础
数据库整理(三) SQL基础 SQL语言的特点 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体. 可以独立完成数据库生命周期中的全部活动: ●定义和修改.删除关 ...
- 【01JMeter基础】测试计划
测试计划 整个脚本的集合根目录,所有线程组集合的承载,可以添加线程组.测试片段.非测试元件.配置元件.监听器.定时器.前置/后置处理起器.断言等 一.用户自定义变量 可以使用在所有的线程组中,通过${ ...
- 基于web网站项目的性能测试结果分析
业务背景: 最近公司研发了一款对并发要求比较高的web项目,需要对其压力测试,模拟线上可能存在的问题,这个过程中遇到一些很多问题,这里重新梳理一下思路,希望能给遇到同样问题的小伙伴提供一个参考. 工具 ...
- Python在Linux下编译安装
[准备环境] Linux centos [前言] 1 linux下默认带Python,带的是2.7版本的 ,如果需要升级版本,需要把系统的自带的Python改名或者卸载,再次安装你所需要的Python ...
- express 框架的使用方法
express 框架的使用方法: 第一步: 生成一个 (express)项目工程 命令提示框的指令是: express (文件名) express -e (文件名) 两段指令的 ...
- sqlserver导致服务器异常卡死
1.业务反应,服务器三天两头就要重启一次,要不然直接hang掉,登上服务器,异常的慢,大概进去需要十分钟的时间,查看一下电脑配置,8核8G的物理机. 2.查看一下任务管理器中的资源使用情况,发现cpu ...
- springboot 集成mybatis时日志输出
application.properties(yml)中配置的两种方式: 这两种方式的效果是一样的,但是下面一种可以指定某个包下的SQL打印出来,上面这个会全部的都会打印出来.
- 10、一个action中处理多个方法的调用第二种方法method的方式
在实际的项目中,经常采用现在的第二种方式在struct.xml中采用清单文件的方式 我们首先来看action package com.bjpowernode.struts2; import com.o ...
- CodeForces 3 D.Least Cost Bracket Sequence【贪心+优先队列】
Description 给出一个括号序列,中间有一些问号,将第i个问号换成左括号代价是a[i],换成右括号代价是b[i],问如果用最少的代价将这个括号序列变成一个合法的括号序列 Input 第一行一个 ...