1. windows为什么支持线程?1. windows为什么支持线程?2. 线程开销3. 线程调度和线程优先级4. 前台线程和后台线程5. 线程的Hello World程序
多线程编程之基础篇
转载早期的windows系统是没有”线程“概念的,整个系统只能运行着一个执行线程,这可能阻塞其他任务的执行,带来极其差的用户体验,基于上述及其操作系统的健壮性,可靠性等,windows引入了“线程”的概念。 线程可以看作是对CPU的虚拟。
2.线程开销
虽然多线程技术能够在一定程度上增加用户 交互体验,但是操作系统创建线程并不是没有代价的,具体来讲:
2.1 windows内核需要创建“线程内核对象”,线程内核对象中包含操作系统需要掌握线程的基本信息
2.2 线程环境块TEB,TEB中包含线程异常处理链首,线程本地存储数据等信息
2.3 用户模式栈
2.4 内核模式栈,应用程序向操作系统的内核模式函数传递参数时,windows将用户模式下的参数复制到内核栈中。
2.5 dll attach和dll detach通知,windows加载dll时,将会发出DLL_THREAD_ATTACH通知,dll卸载时发出DLL_THREAD_DETACH命令,如果一个 应用程序需要加载大量的dll的话,显然对性能的影响是比较大的。
3. 线程调度和线程优先级
在windows上执行的线程在执行了一定时间(一个时间片)后,windows将会进行“调度”,windows按照优先级的高低选择程序开始运行,也就是说如果存在一个优先级是22的线程能够执行,那么windows将不会调用优先级为21的线程。但是windows是一种“抢占式”的操作系统(在windows上执行的线程能够在任何时候被抢占),如果一个具有较高优先级的线程准备好运行,并且当前运行的是较低优先级的线程,windows将迫使较低优先级线程停止运行,开始运行较高优先级的线程。
由于windows上线程调用是(笼统的讲)通过线程的优先级来实现的,那么如果我们想使我们的程序能够被尽量多的调度,就需要设置线程的优先级,windows的优先级是使用数字表示的,在c#中将其抽象为ThreadPriority枚举类型:
[Serializable]
[ComVisible(true)]
public enum ThreadPriority
{
Lowest = 0,
BelowNormal = 1,
Normal = 2,
AboveNormal = 3,
Highest = 4,
}
通常情况下,我们是不需要设置线程的优先级,或者将其设置成Normal优先级。
4. 前台线程和后台线程
CLR将线程分为“前台线程”和“后台线程”。如果一个进程的所有前台线程结束,那么CLR将认为该进程已经结束,将自动结束该进程的后台线程,这些后台线程终止时,不产生异常。在c#中,使用Thread类的IsBackground方法来设置。
public bool IsBackground { get; set; }
通过线程池创建的线程默认是后台线程,通过 Thread t = new Thread(DoWork);形式创建的线程默认是前台线程,除非使用IsBackground设置成false。下面是一个测试代码:
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(DoWork);
t.IsBackground = false;
t.Start();
Console.WriteLine("Returning from Main");
}
private static void DoWork()
{
Thread.Sleep(10000);
// 下面的代码只有在前台线程才能够执行
Console.WriteLine("Returning from worker");
}
}
5. 线程的Hello World程序
c#中通过System.Threading.Thread创建一个线程是比较简单的,Thread的常用构造函数:
public Thread(ParameterizedThreadStart start); // 创建线程,并向线程中传递参数
public Thread(ThreadStart start); // 创建线程,但是无法向启动的线程中传递参数,主要是ThreadStart委托定义的原因
public delegate void ThreadStart();
创建了一个Thread对象之后,调用Start方法开始启动线程。
public void Start();
完成代码如下:
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(DoWork);
Console.WriteLine("Start the new thread...");
t.Start();
Console.WriteLine("Wait the thread to end .");
// 等待线程t结束
t.Join();
Console.WriteLine("Thread Ends");
Console.WriteLine("Press any key to continue");
Console.ReadKey();
}
private static void DoWork()
{
Console.WriteLine("In DoWork thread");
// 当前线程休眠一段时间,用来模拟工作了一段时间
Thread.Sleep(1000);
}
}
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Python中多线程、进程与协程编程
本文给出Python中多线程、进程与协程编程各自使用场景及使用基本思路总结。
Python 多线程 事件循环 多进程 协程 -
并发编程之多线程基础(一)
文章目录一、线程和进程1.1. 什么是进程和线程1.2. 线程的优缺点二、串行、并行和并发2.1. 三者
多线程 多核CPU 内存 守护线程 多核 -
Linux多线程编程之线程安全!
在多线程环境中,多个线程在同一时刻对同一份资源进行写操作时,不会出现数据不一致。反之,则是线程非安全的。能再进一步细分的操作。
c语言 嵌入式 linux 多线程 线程安全 -
多线程---基础篇
多线程指在一个程序内同时运行多个线程。线程可以理解为轻量级的进
java 多线程 System d3 -
iOS多线程编程之GCD
正文: 1 iOS和OS X中多线程基本概念 1.1 了解GCD 1.1.1 iOS和OS X中,实现多线程编
iOS多线程编程之GCD 并行任务 优先级 主线程 -
多线程编程基础
本文主要介绍Linux下的多线程编程基础
Linux 多线程 编程基础