习题 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) 前台线程和后台线程的区别是后台线程不会影响进程终止。属于某个进程的所有前台线程都终止后,公共语言运
行库就会结束该进程,而且所有属于该进程的后台线程也都会立即停止,而不管后台工作是否完成。
利用 Thread 对象的 IsBackground 属性,可以设置或判断一个线程是后台线程还是前台线程。在任何时候,都可以通
过将某个线程的 IsBackground 属性设置为 true,使其变为后台线程。
2.为什么要用多线程?多线程适用于哪种场合?
【解答】
在 Client/Server 模式下,服务器需要不断监听来自多个客户端的请求,这时,如果采用单线程机制的话,这个线程由
于要不断的循环监听客户端请求,从而无暇处理其他的任务。要让服务器同时为多个客户服务,必须引入多线程技术。实际
上,当执行需要较长时间才能完成的连续操作时,或者等待网络或其他 I/O 设备响应时,都可以使用多线程技术。多线程特
别适用于需要不同资源(如文件句柄和网络连接)的任务。
3.什么是线程同步?为什么需要使用线程同步?C#提供了什么语句可以简单地实现线程的同步?
【解答】
多个线程同时运行时,可能会因为线程之间的逻辑关系而而决定最先执行,谁后执行。这就是线程同步。同步是多线
程中一个非常重要的概念。所谓同步,是指多个线程之间存在先后执行顺序的关联关系。
使用多线程可以解决了吞吐量和响应速度的问题,但同时也带来了资源共享问题,如死锁和资源争用。如果一个线程
必须在另一个线程完成某个工作后才能继续执行,则必须考虑如何让其保持同步,以确保在系统上同时运行多个线程而不会
出现死锁或逻辑错误。当两个线程 t1 和 t2 有相同的优先级,并且同时在系统上运行时,如果先把时间片分给 t1 使用,它在
变量 variable1 中写入某个值,但如果在时间片用完时它仍没有完成写入,这时由于时间片已经分给 t2 使用,而 t2 又恰好要
尝试读取该变量的值,此时读出的就不是正确的值。这种情况下,如果使用同步仅允许一个线程使用 variable1,在该线程完
1