1 线程基础
主要学习Windows和CLR如何协同提供一个线程处理架构。
1.1 使用专用线程
1)线程需要以非普通线程优先级运行。
2)需要线程作为一个foreground thread,放置应用程序在线程结束任务前终止。
3) The compute-bound task is extremely long-running;
4) 可能调用Thread的Abort方法来提前终止它。
为了创建专用线程,要构造System.Threading.Thread类的实例。
public sealed class Thread : CriticalFinalizerObject, ... {
public Thread(ParameterizedThreadStart start);
// Less commonly used constructors are not shown here
}
start方法参数标识专用线程要执行的方法,该方法必须和 ParameterizedThreadStart委托的签名匹配。
delegate void ParameterizedThreadStart(Object obj);
1.2 线程调度和优先级
注1:抢占式操作系统必须使用算法判断在什么时候调用哪些线程多长时间。
注2:每个线程的内核对象都包含一个上下文结构,上下文反应了线程上一次执行完毕后CPU寄存器的状态。
系统将进程的优先级类和其中的一个线程的相对优先级映射为一个优先级(0~31)。
1.3 Foreground Threads 和 Background Threads
CLR将每个线程要么视为Foreground Threads,要么视为Background Threads。一个进程的所有前台线程停止运行时,CLR强制终止仍在运行的任何后台线程。这些后台线程被直接终止,不抛出异常。
在线程的生存期,任何时候都可以从前台线程变成后台线程,或者从后台线程变为前台线程。IsBackground字段来设置。
应用程序的主线程以及通过构造一个Thread对象来显示创建的任何线程都默认前台线程,而线程池线程默认为后台线程。另外,由进入托管