多线程的简介
多线程是并行化的一种形式,或者是拆分工作以便同时进行处理。线程化的程序将工作拆分到多个软件线程,而不是将大量工作交给单个内核。这些线程由不同的 CPU 内核并行处理,以节省时间。
根据其构建方式,游戏可能是轻线程的,也可能是重线程的。一些旧游戏引擎以依赖单线程性能而闻名,这意味着它们大多使用单个 CPU 内核,并通过更高的时钟速度来获得大幅度性能提升。
如今,Unreal Engine 4 等游戏引擎都会在创建复杂场景时利用多个内核。引擎还可以使用多线程来处理“绘制调用”( CPU 向 GPU 发送的关于绘制游戏内对象、纹理和着色器的指令)的不同部分。
在计算机编程中,一个基本的理念就是同时对多个任务加以控制。许多程序设计问题都要求程序能够停下手头的工作,改为处理其他一些问题,再返回主进程,也就是“中断”。可以通过多种途径和方式达到中断的目的。最早,掌握计算机低级编程语言的程序员编写的一些“中断服务例程”,其中主进程的暂停是通过硬件级的中断实现的。尽管这是一种有用的方法,但编出的程序很难移植,由此造成了另一类的代价高昂问题。中断对那些实时性很强的任务来说是很有必要的。但对于其他许多问题,只要求将问题划分进入独立运行的程序片段中,使整个程序能更迅速地响应用户的请求 [2]。
原本,线程只是用于分配单个处理器的处理时间的一种工具。但假如操作系统本身支持多个处理器,那么每个线程都可分配给一个不同的处理器,真正进入“并行运算”状态。从程序设计语言的角度看,多线程操作最有价值的特性之一就是程序员不必关心到底使用了多少个处理器。程序在逻辑意义上被分割为数个线程;假如机器本身安装了多个物理处理器或逻辑处理器,那么程序会运行得更快,无需作出任何特殊的调校。根据前面的论述,大家可能感觉多线程处理有利无弊,但必须注意一个问题:共享资源。如果有多个线程同时运行,当它们试图访问相同的资源,就会遇到问题。举个例子来说,两个线程不能将信息同时发送给一台打印机。为解决这个问题,对那些可共享的资源来说(比如打印机),它们在使用期间必须进入锁定状态。所以一个线程可将资源锁定,在完成了它的任务后,再解开(释放)这个锁,使其他线程可以接着使用同样的资源 [2]。
线程是进程中的一部分,也是进程的的实际运作单位,它也是操作系统中的最小运算调度单位。进程中的一个单一顺序的控制流就是一条线程,多个线程可以在一个进程中并发。可以使用多线程技术来提高运行效率。 [8]
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的 [2]。
原理<
br>
实现多线程是采用一种并发执行机制 [3]。
并发执行机制原理:简单地说就是把一个处理器划分为若干个短的时间片,每个时间片依次轮流地执行处理各个应用程序,由于一个时间片很短,相对于一个应用程序来说,就好像是处理器在为自己单独服务一样,从而达到多个应用程序在同时进行的效果 [3]。
多线程就是把操作系统中的这种并发执行机制原理运用在一个程序中,把一个程序划分为若干个子任务,多个子任务并发执行,每一个任务就是一个线程。这就是多线程程序 [3]。
多线程技术不但可以提高交互速度,而且能够更加高效、便捷地进行控制。在对多线程应用的时候,可以使程序响应速度得到提高,从而实现速度化、高效化的特点。另外,多线程技术存在的缺点也比较明显,需要等待比较长的时间之外,还会在一定程度上使程序运行速度降低,使工作效率受到一定的影响,从而对资源造成了浪费。 [9]
优点
1、使用线程可以把占据时间长的程序中的任务放到后台去处理 [4]。
2、用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 [4]。
3、程序的运行速度可能加快 [4]。
4、在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等 [4]。
5、多线程技术在iOS软件开发中也有举足轻重的作用 [4]。
缺点
1、如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换 [4]。
2、更多的线程需要更多的内存空间 [4]。
3、线程可能会给程序带来更多“bug”,因此要小心使用 [4]。
4、线程的中止需要考虑其对程序运行的影响 [4]。
5、通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生 [4]。