没有合适的资源?快使用搜索试试~ 我知道了~
2. 为什么GUI不支持跨线程访问控件 3. 简述后台线程和前台线程的区别 4. 说说常用的锁,lock是一种什么样的锁 5. lock为什么要锁定一个参数,可
资源推荐
资源详情
资源评论
系列文章目录地址:
1. 描述线程与进程的区别?
2. 为什么 GUI 不支持跨线程访问控件?一般如何解决这个问题?
3. 简述后台线程和前台线程的区别?
4. 说说常用的锁,lock 是一种什么样的锁?
5. lock 为什么要锁定一个参数,可不可锁定一个值类型?这个参数有什么要求?
6. 多线程和异步有什么关系和区别?
7. 线程池的优点有哪些?又有哪些不足?
8. Mutex 和 lock 有何不同?一般用哪一个作为锁使用更好?
9. 下面的代码,调用方法 DeadLockTest(20),是否会引起死锁?并说明理由。
Public void DeadLockTest(int i)
{
lock (this) //或者 lock 一个静态 object 变量
{
if (i > 10)
{
Console.WriteLine(i--);
DeadLockTest(i);
}
}
}
10. 用双检锁实现一个单例模式 Singleton。
11.下面代码输出结果是什么?为什么?如何改进她?
int a = 0;
System.Threading.Tasks.Parallel.For(0, 100000, (i) =>{ a++; });Console.Write(a);
线程基础
进程与线程
我们运行一个 exe,就是一个进程实例,系统中有很多个进程。每一个进程都有自己
的内存地址空间,每个进程相当于一个独立的边界,有自己的独占的资源,进程之间不能
共享代码和数据空间。
image
每一个进程有一个或多个线程,进程内多个线程可以共享所属进程的资源和数据,线程是
操作系统调度的基本单元。线程是由操作系统来调度和执行的,她的基本状态如下图。
image
线程的开销及调度
当我们创建了一个线程后,线程里面到底有些什么东西呢?主要包括线程内核对象、
线程环境块、1M 大小的用户模式栈、内核模式栈。其中用户模式栈对于普通的系统线程
那 1M 是预留的,在需要的时候才会分配,但是对于 CLR 线程,那 1M 是一开始就分类了
内存空间的。
补充一句,CLR 线程是直接对应于一个 Windows 线程的。
image
还记得以前学校里学习计算机课程里讲到,计算机的核心计算资源就是 CPU 核心和 CPU 寄
存器,这也就是线程运行的主要战场。操作系统中那么多线程(一般都有上千个线程,大
部分都处于休眠状态),对于单核 CPU,一次只能有一个线程被调度执行,那么多线程怎
么分配的呢?Windows 系统采用时间轮询机制,CPU 计算资源以时间片(大约 30ms)的形式
分配给执行线程。
计算机资源(CPU 核心和 CPU 寄存器)一次只能调度一个线程,具体的调度流程:
把 CPU 寄存器内的数据保存到当前线程内部(线程上下文等地方),给下一个线程腾
地方;
线程调度:在线程集合里取出一个需要执行的线程;
加载新线程的上下文数据到 CPU 寄存器;
新线程执行,享受她自己的 CPU 时间片(大约 30ms),完了之后继续回到第一步,
继续轮回;
上面线程调度的过程,就是一次线程切换,一次切换就涉及到线程上下文等数据的搬
入搬出,性能开销是很大的。因此线程不可滥用,线程的创建和消费也是很昂贵的,这也
是为什么建议尽量使用线程池的一个主要原因。
对于 Thread 的使用太简单了,这里就不重复了,总结一下线程的主要几点性能影响:
线程的创建、销毁都是很昂贵的;
线程上下文切换有极大的性能开销,当然假如需要调度的新线程与当前是同一线程的
话,就不需要线程上下文切换了,效率要快很多;
这一点需要注意,GC 执行回收时,首先要(安全的)挂起所有线程,遍历所有线程栈
(根),GC 回收后更新所有线程的根地址,再恢复线程调用,线程越多,GC 要干的活就
越多;
当然现在硬件的发展,CPU 的核心越来越多,多线程技术可以极大提高应用程序的效
率。但这也必须在合理利用多线程技术的前提下,了线程的基本原理,然后根据实际需求,
还要注意相关资源环境,如磁盘 IO、网络等情况综合考虑。
多线程
单线程的使用这里就略过了,那太 easy 了。上面总结了线程的诸多不足,因此微软提
供了可供多线程编程的各种技术,如线程池、任务、并行等等。
线程池 ThreadPool
线程池的使用是非常简单的,如下面的代码,把需要执行的代码提交到线程池,线程
池内部会安排一个空闲的线程来执行你的代码,完全不用管理内部是如何进行线程调度的。
ThreadPool.QueueUserWorkItem(t => Console.WriteLine("Hello thread pool"));
每个 CLR 都有一个线程池,线程池在 CLR 内可以多个 AppDomain 共享,线程池是 CLR 内部
管理的一个线程集合,初始是没有线程的,在需要的时候才会创建。线程池的主要结构图
如下图所示,基本流程如下:
线程池内部维护一个请求列队,用于缓存用户请求需要执行的代码任务,就是
ThreadPool.QueueUserWorkItem 提交的请求;
有新任务后,线程池使用空闲线程或新线程来执行队列请求;
任务执行完后线程不会销毁,留着重复使用;
线程池自己负责维护线程的创建和销毁,当线程池中有大量闲置的线程时,线程池会
自动结束一部分多余的线程来释放资源;
剩余12页未读,继续阅读
资源评论
芊暖
- 粉丝: 18
- 资源: 340
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- ZEND解密dezender12
- sony 索尼IMX334摄像头模组电路板AD版硬件PCB图(6层板).zip
- 基于flask和echarts融合交易策略的bitfinex可视化微服务.zip
- 包含了wvp-assist.tar wvp-talk.tar zlmediakit.tar .
- 3r4efgh53wgrf43tw
- 2024新版Java基础从入门到精通全套视频+资料下载
- Spring AI大模型视频教程+ChatGPT视频教程+OpenAI大模型视频教程(资料+视频教程)
- ABB工业机器人教程PDF版本
- 123321123323211
- 三相桥式全桥整流电路MATALB Simulink仿真文件
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功