线程系列06,通过CLR代码查看线程池及其线程
在"线程系列04,传递数据给线程,线程命名,线程异常处理,线程池"中,我们已经知道,每个进程都有一个线程池。可以通过TPL,ThreadPool.QueueUserWorkItem,委托与线程池交互。本篇体验:通过查看CLR代码来观察线程池及其线程。
□ 通过编码查看线程池和线程
使用ThreadPool的静态方法QueueUserWorkItem把线程放入线程池,来看线程池线程和主程序线程的执行情况。
class Program{static void Main(string[] args){Console.WriteLine("主线程开始");for (int i = 0; i < 5; i++){ThreadPool.QueueUserWorkItem(SayHello, i);}Console.WriteLine("主线程结束");}static void SayHello(object arg){int n = (int) arg;Console.WriteLine("线程{0}接收到的参数是:{1},是否是后台线程:{2}",Thread.CurrentThread.ManagedThreadId,n,Thread.CurrentThread.IsBackground);}}

○ 用QueueUserWorkItem方法加入线程池的线程是后台线程
○ 一旦主线程结束,后台线程随即结束
○ 在主程序for语句块中,有2个线程已被创建并执行
让主线程和线程池线程都Sleep一段时间。
class Program{static Random r = new Random();static void Main(string[] args){Console.WriteLine("主线程开始");for (int i = 0; i < 5; i++){ThreadPool.QueueUserWorkItem(SayHello, i);}Thread.Sleep(r.Next(250, 500));Console.WriteLine("主线程结束");}static void SayHello(object arg){Thread.Sleep(r.Next(250, 500));int n = (int) arg;Console.WriteLine("线程{0}接收到的参数是:{1},是否是后台线程:{2}",Thread.CurrentThread.ManagedThreadId,n,Thread.CurrentThread.IsBackground);}}

○ 线程池中的线程依然是后台线程
○ 让主线程Sleep一段时间后,线程池的线程在主线程结束之前得以执行
再让主线程Sleep更长的一段时间。
static void Main(string[] args){Console.WriteLine("主线程开始");for (int i = 0; i < 5; i++){ThreadPool.QueueUserWorkItem(SayHello, i);}Thread.Sleep(r.Next(1000, 3000));Console.WriteLine("主线程结束");}

当主线程Sleep的时间更长后,线程池有更多的线程被执行。
□ 使用"即时窗口"查看CLR中的线程池和线程
以上,通过编码查看线程池和线程,实在是太不方便。我们可以在"即时窗口"中,借助"SOS调试扩展"来观察CLR中的线程池和线程。
→在"Thread.Sleep(r.Next(1000, 3000))"打上断点
→点击"启动"
→当代码运行到断点处,点击"调试"--"窗口"--"即时",打开"即时窗口"
→输入如下命令,加载"SOS调试扩展"
关于"SOS调试扩展"的使用,可参考"调试查看CLR运行代码"。
→输入如下命令,查看线程池
○ Worker Thread显示当前线程池中的线程状况
○ Work Request in Queue显示当前队列中的线程
→输入如下命令,查看所有线程
○ MTA (Finalizer)表示由GC回收的线程
○ MTA (Threadpool Worker) 表示线程池中的线程
□ 查看CLR托管堆上的所有线程类型
→输入如下命令查看CLR托管堆上的所有线程类型
□ 查看CLR托管堆上线程池实例
→找到System.ThreadPoolWorkQueue,复制其前面的MT代码
→输入如下命令,查看线程池实例的堆地址、数量等
□ 查看CLR托管线程池地址
→复制System.Threading.ThreadPoolWorkQueue的托管堆地址
→输入如下命令查看CLR托管线程池地址内容
线程系列包括:
线程系列01,前台线程,后台线程,线程同步
线程系列02,多个线程同时处理一个耗时较长的任务以节省时间
线程系列03,多线程共享数据,多线程不共享数据
线程系列04,传递数据给线程,线程命名,线程异常处理,线程池
线程系列05,手动结束线程
线程系列06,通过CLR代码查看线程池及其线程
线程系列07,使用lock语句块或Interlocked类型方法保证自增变量的数据同步
线程系列08,实现线程锁的各种方式,使用lock,Montor,Mutex,Semaphore以及线程死锁
线程系列10,无需显式调用线程的情形
线程系列06,通过CLR代码查看线程池及其线程的更多相关文章
- 线程系列08,实现线程锁的各种方式,使用lock,Montor,Mutex,Semaphore以及线程死锁
当涉及到多线程共享数据,需要数据同步的时候,就可以考虑使用线程锁了.本篇体验线程锁的各种用法以及线程死锁.主要包括: ※ 使用lock处理数据同步※ 使用Monitor.Enter和Monitor.E ...
- 线程系列07,使用lock语句块或Interlocked类型方法保证自增变量的数据同步
假设多个线程共享一个静态变量,如果让每个线程都执行相同的方法每次让静态变量自增1,这样的做法线程安全吗?能保证自增变量数据同步吗?本篇体验使用lock语句块和Interlocked类型方法保证自增变量 ...
- 7种创建线程方式,你知道几种?线程系列Thread(一)
前言 最近特别忙,博客就此荒芜,博主秉着哪里不熟悉就开始学习哪里的精神一直在分享着,有着扎实的基础才能写出茁壮的代码,有可能实现的逻辑有多种,但是心中必须有要有底哪个更适合,用着更好,否则则说明我们对 ...
- ReentrantLock+线程池+同步+线程锁
1.并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行. 2)可见性 可见性指多个线程操作一个共享变量时,其中一个线程对变量 ...
- 第三十八天 GIL 进程池与线程池
今日内容: 1.GIL 全局解释器锁 2.Cpython解释器并发效率验证 3.线程互斥锁和GIL对比 4.进程池与线程池 一.全局解释器锁 1.GIL:全局解释器锁 GIL本质就是一把互斥锁,是夹在 ...
- GIL锁、进程池与线程池
1.什么是GIL? 官方解释: ''' In CPython, the global interpreter lock, or GIL, is a mutex that prevents multip ...
- C# 多线程学习系列三之CLR线程池系列之ThreadPool
一.CLR线程池 1.进程和CLR的关系一个进程可以只包含一个CLR,也可以包含多个CLR2.CLR和AppDomain的关系一个CLR可以包含多个AppDomain3.CLR和线程池的关系一个CLR ...
- [Sciter系列] MFC下的Sciter–5.Sciter中GUI线程研究
[Sciter系列] MFC下的Sciter–5.Sciter中GUI线程研究,目前MFC存在问题,win32没问题. 本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的Sc ...
- 转:C#线程系列讲座(1) BeginInvoke和EndInvoke方法
转载自:http://www.cnblogs.com/levin9/articles/2319248.html 开发语言:C#3.0IDE:Visual Studio 2008本系列教程主要包括如下内 ...
随机推荐
- Unix IPC之Posix消息队列(2)
/* Query status and attributes of message queue MQDES. */ extern int mq_getattr (mqd_t __mqdes, stru ...
- MS-SQL2005服务器登录名、角色、数据库用户、角色、架构的关系
MS SQL2005对2000进行了很大的改进,而用户关系这部分也变得相当复杂了,很多朋友都对此一知半解!下面,我将把我应用中总结的和大家分享下,先从概念入手,希望对不理解的朋友有点提示. 今天我们要 ...
- Shell学习笔记:<<EOF子命令
在shell编程中,“EOF”通常与“<<”结合使用,“<<EOF”表示后续的输入作为子命令或子shell的输入,直到遇到“EOF”,再次返回到主调用shell,可将其理解为分 ...
- bzoj 4034(DFS序+线段树)
这个题多了一个操作难度直线上升,看完题解才会写 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 ...
- day5作业购物商城+ATM
模拟实现一个ATM + 购物商城程序 1.额度 15000或自定义 2.实现购物商城,买东西加入购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.每月22号出账单,每月10号为还款日,过期未还 ...
- USACO 5.3 Network of Schools
Network of SchoolsIOI '96 Day 1 Problem 3 A number of schools are connected to a computer network. A ...
- 使用 Web 服务 为 ECS Linux 实例配置网站及绑定域名
Nginx 服务绑定域名 https://help.aliyun.com/knowledge_detail/41091.html?spm=a2c4e.11155515.0.0.4lvCpF 以 YUM ...
- js根据IP跳转
<script language="javascript" type="text/javascript" src="http://int.dpo ...
- 如何保证Redis中的数据都是热点数据
redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略.redis 提供 6种数据淘汰策略:volatile-lru:从已设置过期时间的数据集(server.db[i].expires) ...
- ubuntu16.04(64位)建立交叉编译环境,并配置编译内核
安装步骤 1.准备工具安装目录 将压缩包gcc-linaro-arm-linux-bnueabihf-4.9-2014.07_linux.tar存放在一个目录下,这个目录就是你等会解压缩的目录,以后这 ...