C#多线程的学习(一)
一、线程的定义
1.多任务
多任务这个术语是指操作系统一次运行多个应用程序的能力。使用同步技术可以解决抢先式多任务的相关问题。
2.进程
内存和资源的物理分离叫做进程,一个应用程序可以启动多个进程,分配给进程的内存与为其他进程分配的内存被隔离,只有所属的那个进程才可以访问它。每个进程都有自己独立的数据、执行代码和系统资源。
3.线程
进程有一个由计算机的处理器使用的执行次序,这个执行次序就称为线程,进程由寄存器定义,记录CPU的使用情况、线程使用的堆栈以及跟踪线程当前状态的容器,这个容器就叫做线程本地存储区(Thread Local Storage)
3.1 单线程的进程
每个进程至少包括一个执行线程,创建一个进程包括在指令中的某一点启动进程,这个最初的线程称为基本线程或主线程。线程的实际执行顺序是由应用程序中的方法代码来决定的。
3.2 时间片
3.3 多线程的进程
可以将进程分解,以共享分配给它的时间片,通过在进程中产生额外的执行线程,就可以分解进程,产生一个额外的线程来完成后台的工作,这些辅助线程称为工作线程(Worker thread),这些线程将共享进程的内存空间(这些内存空间与系统上的其他进程隔离开来),这些在进程中产生的新线程就称为自由线程。
二、.Net和C#对线程的支持(支持自由线程)
2.1 System.AppDomain类
.Net新增了一个隔离层,称为应用程序域或AppDomain,应用程序域不像进程那样是一个物理独立的部分,而是进程内部的一个逻辑独立部分,在一个进程中可以存在多个应用程序域。应用程序域与线程也有直接的关系,他们可以保持一个或多个线程,就像进程一样,不同之处在于,应用程序域可以在进程内部创建,但不创建新线程。应用程序域和进程以及线程的关系如下图:
2.2 设置AppDomain数据
{
public AppDomain domain;
public int ThreadID;
public void SetDomainData(string vName, string vValue)
{
domain.SetData(vName, vValue);
ThreadID = AppDomain.GetCurrentThreadId();
}
public string GetDomainData(string name)
{
return (string)domain.GetData(name);
}
static void Main()
{
string dataName = "MyData";
string dataValue = "Some Data to be stored";
Console.WriteLine("Retrieving current domain");
MyAppDomain obj = new MyAppDomain();
obj.domain = AppDomain.CurrentDomain;
Console.WriteLine("Setting domain data");
obj.SetDomainData(dataName, dataValue);
Console.WriteLine("Getting domain data");
Console.WriteLine("The Data found for key" + dataName + "is" +
obj.GetDomainData(dataName) + " running on thread id:" +obj.ThreadID);
}
}
2.3在指定的应用程序域中执行代码
{
static void Main(string[] args)
{
AppDomain DomainA;
DomainA = AppDomain.CreateDomain("DomainA");
string StringA = "DomainA Value";
DomainA.SetData("DomainKey", StringA);
CommonCallBack();
CrossAppDomainDelegate delegateA = new CrossAppDomainDelegate(CommonCallBack);
DomainA.DoCallBack(delegateA);
}
public static void CommonCallBack()
{
AppDomain Domain;
Domain = AppDomain.CurrentDomain;
Console.WriteLine("The value'" + Domain.GetData("DomainKey")
+ "' was found in " + Domain.FriendlyName
+ " running on thread id :"
+ AppDomain.GetCurrentThreadId().ToString());
}
}
2.4 线程管理与.Net运行库
.Net不仅提供了对自由线程的进程和逻辑应用程序域的支持,还提供了处理器线程的对象表示,这些对象表示都是在System.Threading.Thread类的实例。
.Net运行库监控着由.Net代码创建的所有线程。它还监控着所有可以执行托管代码的非托管线程。