第02章 进程与线程习题解答
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第2章进程与线程
习题2 参考解答
1. 简要回答下列问题。
1) 进程和线程有什么区别?
2) 线程是如何创建的?怎样设置线程的优先级?
3) 前台线程和后台线程有什么区别?如何将一个线程设置为后台线程?
【解答】
1) 一个完整的进程拥有自己独立的内存空间和数据,但是同一个进程内的线程是共享内存空间和数据的。一个进程对应着一段程序,它是由一些在同一个程序里面独立的同时运行的线程组成的。线程有时也被称为并行运行在程序里的轻量级进程,这是因为它的运行依赖于进程提供的上下文环境,并且使用的是进程的资源。
在一个进程里,线程的调度有抢占式或者非抢占的模式。在抢占模式下,操作系统负责分配CPU时间给各个线程,一旦当前的线程使用完分配给自己的CPU时间,操作系统将决定下一个占用CPU时间的是哪一个线程。因此操作系统将定期的中断当前正在执行的线程,将CPU 分配给在等待队列的下一个线程。所以任何一个线程都不能独占CPU。每个线程占用CPU的时间取决于进程和操作系统。进程分配给每个线程的时间很短,以至于我们感觉所有的线程是同时执行的。
2) C#中创建线程的工作是通过使用System.Threading名称空间下的Thread类的构造方法来完成的,如创建一个线程实例输出字符“a”1000次。
Thread thread = new Thread(new ThreadStart(func1));
thread.Priority =ThreadPriority.Normal;
thread.Start();
static void func1()
{
for(int i =0;i<1000;i++)
{
Console.WriteLine("a");
}
}
C#中System.Threading名称空间下的ThreadPriority枚举类定义了线程可能具有的所有优先级的值,优先级由高到低排序为:Highest,AboveNormal,Normal,BelowNormal,Lowest。可以通过访问线程的Priority属性来获取和设置其优先级。每个线程都具有分配给它的线程优先级。在公共语言运行库中创建的线程最初分配的优先级为ThreadPriority.Normal。在运行库以外创建的线程保留它们在进入托管环境之前具有的优先级。可以使用Thread.Priority属性获取或设置任何线程的优先级。
3) 前台线程和后台线程的区别是后台线程不会影响进程终止。属于某个进程的所有前台线程都终止后,公共语言运行库就会结束该进程,而且所有属于该进程的后台线程也都会立即停止,而不管后台工作是否完成。
1
第2章进程与线程
2利用Thread对象的IsBackground属性,可以设置或判断一个线程是后台线程还是前台线
程。在任何时候,都可以通过将某个线程的IsBackground属性设置为true,使其变为后台线程。
2.为什么要用多线程?多线程适用于哪种场合?
【解答】
在Client/Server模式下,服务器需要不断监听来自多个客户端的请求,这时,如果采用单线程机制的话,这个线程由于要不断的循环监听客户端请求,从而无暇处理其他的任务。要让服务器同时为多个客户服务,必须引入多线程技术。实际上,当执行需要较长时间才能完成的连续操作时,或者等待网络或其他I/O设备响应时,都可以使用多线程技术。多线程特别适用于需要不同资源(如文件句柄和网络连接)的任务。
3.什么是线程同步?为什么需要使用线程同步?C#提供了什么语句可以简单地实现线程的同步?
【解答】
多个线程同时运行时,可能会因为线程之间的逻辑关系而而决定最先执行,谁后执行。这就是线程同步。同步是多线程中一个非常重要的概念。所谓同步,是指多个线程之间存在先后执行顺序的关联关系。
使用多线程可以解决了吞吐量和响应速度的问题,但同时也带来了资源共享问题,如死锁和资源争用。如果一个线程必须在另一个线程完成某个工作后才能继续执行,则必须考虑如何让其保持同步,以确保在系统上同时运行多个线程而不会出现死锁或逻辑错误。当两个线程t1和t2有相同的优先级,并且同时在系统上运行时,如果先把时间片分给t1使用,它在变量variable1中写入某个值,但如果在时间片用完时它仍没有完成写入,这时由于时间片已经分给t2使用,而t2又恰好要尝试读取该变量的值,此时读出的就不是正确的值。这种情况下,如果使用同步仅允许一个线程使用variable1,在该线程完成对variable1的写入工作后再让t2读取这个值,就可以避免出现此类错误。
C#提供了lock语句来实现线程的同步。
4.什么是线程池?使用线程池有什么好处?
【解答】
线程池是在后台执行多个任务的线程集合。使用线程池接受传入的请求,每个传入请求都分配给线程池中的一个线程,从而达到异步处理请求的目的。在服务器应用程序中,如果每到一个请求就创建一个新线程,然后在新线程中为其请求服务的话,将不可避免的造成系统开销的增大。实际上,创建太多的线程可能会导致由于过度使用系统资源而耗尽内存。为了防止资源不足,服务器应用程序可以采用线程池来限制同一时刻处理的线程数目。线程池不会占用主线程,也不会延迟后续请求的处理。一旦池中的某个线程完成任务,它将返回到等待线程队列中,等待被再次使用。这种重用使应用程序可以避免为每个任务创建新线程引起的资源和时间消耗。