C#多线程基础
开始学习C#多线程
进程和进程之间是被物理隔离的。
进程至少有一个顺序执行的线程,线程会对进程中的数据进行访问。
线程物理层面是由CPU上正在使用的寄存器,线程使用退栈保存线程状态。
处理器实际上为进程分配时间。进程可以执行的时间被称作“时间片”或者“限量”。时间片的间隔对程序员和任何非操作系统内核的程序来说都是变化莫测的。程序员不应该在他们的程序中将时间片的值假定为一个常量。每个操作系统和每个处理器都可能设定一个不同的时间。
这里涉及到一个概念就是自由线程和单元线程。单元线程的概念就是每个进程被分配一份它需要的全局数据进行拷贝执行
这就是单元线程
net中用到的是之自由线程
自由线程每次当你想做一些后台的工作时,它一般在它自己的进程中进行。因此这又称作在进程内运行。
1.什么是System.AppDomain类以及能帮你做啥
AppDomain (应用程序域)
系统上面只能运行的进程不能直接运行.net程序。它就需要有一个容器,这个容器就是AppDomain ,然后.net程序运行在这个应用程序域中.
应用程序域不是像进程那样的物理隔离;它是进程内部的进一步的逻辑隔离。由于在一个进程中可能有多个应用程序域,所以我们有一些优势。大体上说,对标准进程来说不通过代理访问其他进程的数据是不可能的, 而使用代理会导致重大开销和代码复杂化。然而,通过介绍应用程序域的概念,我们现在可以在一个进程中运行多个程序。进程提供的隔离在应用程序域中也存在。线程可以在不同应用程序域间执行而没有与相关的内部进程通信开销。这些额外的进程内部的壁垒的好处是他们对内部数据提供类型检查。
微软将这些应用程序域相关的所有功能封装到一个System.AppDomain的类中。微软.NET 程序集与这些应用程序域之间有紧密联系。任何时候当一个程序集被加载到一个程序中时,它实际上是被加载到应用程序域中。除非特别情况,程序集都会被加载到调用代码的应用程序域中。应用程序域与线程也有一个直接关系;它们可以有一个或多个线程,就像进程一样。然而,不同点是一个应用程序域可能在进程内部创建而不是通过新的线程创建。这个关系可以简化成如图9所示的模型。
在.NET 中,AppDomain和线程类由于安全原因而不能继承。
每个应用程序都包含一个或者多个AppDomains.每个AppDomain可以创建并执行多个线程。下图显示在机器X上有两个操作系统进程Y和Z。操作系统进程Y有四个应用程序域:A,B,C和D。操作系统进程Z有两个应用程序域:A和B。
不论一个AppDomain有没有线程,线程都可以跨应用程序域执行,这是很重要的。
托管线程就是net中的线程Theard,非托管线程就是C++中的线程等。
.NET 运行时监控所有由.NET代码创建的线程。它也监控所有可能在托管代码中执行的非托管线程。由于托管代码可以通过COM-可调用包装暴露,所以非托管线程运行在.NET运行时中是可能的。
当非托管代码运行在一个托管线程中,运行时将会检查一个托管线程对象的TLS是否存在。如果找到了一个托管线程,运行时就会使用它。否则它将创建一个新的然后使用。这很简单,但是需要注意。我们仍想要得到一个关于我们线程的对象表示而不管它来自哪里。如果运行时无法管理且为外部调用类型创建线程,我们将无法在托管环境中确定线程,甚至控制它。
关于线程管理最后一件重要的事是一旦非托管调用返回到非托管代码中,运行时将无法继续检测它。
就是托管代码中可以运行非托管线程。
非托管代码也可以运行在托管线程中。
以次博客进行线程知识的巩固
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具