如何正确的在。net中使用线程

介绍

今天就跟大家聊聊有关如何正确的在。净中使用线程,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

1,线程内核对象。该数据结构中包含线程上下文.Windows在x86架构CPU上为每个线程内核对象分配的空间大约为700字节,x64和IA64架构CPU分别为大约1240字节和2500字节。

2,线程环境块。占用一个内存页,包含线程的异常处理链首。当线程进入试块时,在链首插入一个节点,在线程对出退出试块时,删除该节点。另外线程环境块中还包括一些其他的本地储蓄数据。

3,用户模式栈。用户存储传给方法的局部变量和实参,还包含一个地址,指出当方法返回时,线程应该从什么地方开始接着执行。默认情况下每个线程的用户模式栈分配1 mb内存。

4,内核模式栈。记录用户程序调用内核模式函数时函数的实参32位系统分配12 kb内存,64位系统则分配24 kb。

5, DLL线程连接和线程分离通知。进程中每创建和终止一个线程时,都会调用进程中加载的所有DLL的开始时方法。

6,上下文切换。对单CPU计算机来说,操作系统每次只将一个线程分配给CPU执行,执行完后将线程上下文数据记录下来保存在线程内核对象结构中,然后装载另一个线程的上下文,将CPU执行控制交给此线程,如果该线程有另一个进程拥有,那么在装载该线程之前,窗户还必须使CPU能得够处理该虚拟地址空间.Windows操作系统为各个线程每次分配大概30毫秒的执行时间,称为“时间片”。上下文切换是净开销,不会换来任何在存储空间或者性能上的收益。但是能向用户提供一个健壮的能灵活相应的操作系统。

<强>空间开销测试

<强>测试代码:

代码如下:


静态void Main (string [] args)
,,,,,,,,{
,,,,,,,,,,,,ListthreadList=new List ();
,,,,,,,,,,,,for (int i=0;我& lt;1000;我+ +)
,,,,,,,,,,,,{
,,,,,,,,,,,,,,,,线程的线程=新线程(
,,,,,,,,,,,,,,,,,,,,新ParameterizedThreadStart (o=比;{Console.WriteLine(“第{0}线程“,o);thread . sleep (100000);})
,,,,,,,,,,,,,,,,,,,,),
,,,,,,,,,,,,,,,,threadList.Add(线程);
,,,,,,,,,,,,}
,,,,,,,,,,,,Console.ReadLine ();
,,,,,,,,,,,,for (int i=0;我& lt;threadList.Count;我+ +)
,,,,,,,,,,,,{
,,,,,,,,,,,,,,,,threadList[我].Start (i),
,,,,,,,,,,,,}
,,,,,,,,,,,,Console.ReadLine ();
,,,,,,,,}


<强> pslist的观测结果结果:

如何正确的在。网络中使用线程

程序开始运行时

如何正确的在。净中使用线程

所有线程开始以后

1000个线程开始以后虚拟物理内存占用量增加了31个mb,而虚拟内存增加了1000 mb之多。

<强>线程池

由于专用线程(实例化线程类所创建的线程)存在的巨大内存和性能开销,CRL被设计出支持线程池技术,为应用程序提供线程管理。每个CLR独立维护一个自己的线程池,CLR在线程池中只建立必要的线程供给应用程序使用,在应用程序把多个任务分配给线程池后,CLR将任务轮流分配给线程池中线程来执行,当任务执行完毕后,线程池中的线程并不会回收,而是等待分配新的任务。这就能有效的减少线程的数量,并且减少了线程创建时的性能开销(线程池相关的内容笔者正在整理之中,后续会陆续发布)。另外,对于线程类有一个实例属性IsBackground指示线程是前台还是后台运行,前台线程指线程所在进程关闭时,进程需要等待线程执行完成才能关闭,后台进程指当进程关闭时,线程立即停止执行,不会等待执行完成既退出运行。该属性默认值为真,即专用线程默认为前台线程。

<强>进程,AppDomain和线程

这里涉及到进程,AppDomain和线程,我觉得有必要把这三个概念放一起做一个大体的比对。

1,进程是操作系统为应用程序虚拟的执行地址空间,应用程序中的所有数据都装载在相互独立的进程中运行。

2, AppDomain是。净托管应用装载的内部相互隔离的托管执行空间。如:IIS进程中所有的网络应用都运行在独立的AppDomain中。

3线程是应用程序内部虚拟化的CPU执行单元,操作系统对内存中所有应用程序进程中的线程进行调度,交给CPU进行执行。

进程是一个虚拟的地址空间,操作系统不会对其进行调度而是调度执行其中包含的线程.CLR在AppDomain内部也有自己的运行线程,AppDomain中的线程由CLR维护,但最终CLR仍需将AppDomain中的线程映射为应用程序进程中的线程,交给操作系统进行调度。并且AppDomain中的线程不一定与操作系统线程完全一一对应。

如何正确的在。net中使用线程