NET目前的每一个线程对应的是windows系统的物理线程,每个线程都会包含一下一些要素:
1.线程内核对象(Thread kernel object),OS为系统中每一个线程分配初始化的数据结构,包含线程上下文Thread Context(一个内存区域包含CPU寄存器集合);
2.线程环境块(Thread Environment block),包含了线程的异常处理链首,线程每次进入try块,都会在链首插入一个节点,退出try块时,会从链中删除节点。还包含了一些其他的数据;
3.用户模式栈(user-mode stack),包含传给方法的局部变量和实参,以及方法的返回地址;
4.内核模式栈(kernel-mode stack),运用程序调用内核模式函数时,会使用内核模式栈,主要是处于安全的原因考虑,用户模式的代码传给内核模式的代码,会被从用户模式栈拷贝到内核模式栈中。
线程执行上下文(Execute context):每一个线程都关联了一个执行上下文数据结构。包括的东西有安全设置(压缩栈,Thread的principle属性和windows的身份 ),宿主设置以(System.Threading.HostExecutionContextManager)及逻辑调用上下文数据(System.Runtime.Remoting.Messaging.ExecutionContext)。线程执行代码的时候,有些操作会受到线程执行上下文的限制,例如安全设置的影响。理想情况下,在一个线程中调用另外一个线程,想成上下文应该流动(复制)到另外一个线程中,确保两个线程有相同的执行上下文。执行上下文的流动是需要消耗性能的。System.Threading空间中有一个ExcecuteContext类可以执行上下文如何留下另外一个线程。阻止上下文流动可以提升一定的性能,前提是需要保证,新线程不应该依赖于调用ExcecuteContext控制执行上下文流动线程的执行上下文。
static void Main(string[] args)
{
CallContext.LogicalSetData("jedi", 23);
ExecutionContext.SuppressFlow();
ThreadPool.QueueUserWorkItem(CallBack);
ExecutionContext.RestoreFlow();
ThreadPool.QueueUserWorkItem(CallBack);
Console.ReadLine();
}
static void CallBack(object state)
{
Console.WriteLine("上下文结果:"+CallContext.LogicalGetData("jedi"));
}
执行结果是
上下文结果:
上下文结果:23