多线程经典面试问题

多线程在笔试面试中经常出现,下面列出一些公司的多线程笔试面试题。首先是一些概念性的问答题,这些是多线程的基础知识,经常出现在面试中的第一轮面试。然后是一些选择题,这些一般在笔试时出现,虽然不是太难,但如果在选择题上花费大多时间无疑会对后面的编程题造成影响,因此必须迅速的解决掉。最后是综合题即难一些的问答题或是编程题。这种题目当然是最难解决了,要么会引来面试官的追问,要么就很容易考虑不周全,因此解决这类题目时一定要考虑全面和细致。
下面就来看看这三类题目吧。

一.问答题
第一题:什么是进程,什么是线程、线程的基本状态及状态之间的关系?
1,什么是进程?
进程是资源申请、调度和独立运行的单位,它使用系统中的运行资源。进程通常被定义为一个正在运行程序的实例,是一个程序在其自身的地址空间中的一次执行活动。
进程由两部分组成:
(1)内核对象,由操作系统来管理,内核对象是系统用来存放进程的统计信息的地方,其初始计数为1。内核对象是操作系统内部分配的一个内存块,它是操作系统用来管理这个进程的一种数据结构,其成员负责维护该对象的各种信息。
(2)地址空间,它包含所有可执行模块或DLL模块的代码和数据。另外,它也包含动态内存分配的空间,例如线程的栈和堆分配的空间。
但是进程极具“惰性”从来不执行任何东西,它只是线程的容器。进程要完成任何事情,都必须让一个线程在其上下文中运行,此线程负责执行包含在进程地址空间中的代码。
也就是说:真正完成代码执行的是线程,而进程是线程的容器,或者说是线程的执行环境。系统赋予每个进程独立的虚拟地址空间,对于32位进程来说,这个地址空间是4GB。



2,什么是线程?
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它现成共享进程所拥有的全部资源。
线程由两部分组成:
(1) 线程的内核对象。操作系统用线程的内核对象对线程进行管理,内核对象也是系统用来存放线程统计信息的地方。
(2) 线程栈。线程栈用于维护线程在执行代码时需要的所有函数参数和局部变量。



3,线程的基本状态
线程存在多种状态。
调用线程后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞状态,当synchronized获得锁后,由阻塞状态转为运行状态,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。


第二题:线程与进程的区别?
进程和线程简单而基本靠谱的区别如下:
1. 进程概念:程序(静态的)的一次运行活动,只是线程的容器,是线程的“工作环境”,是系统进行资源分配和调度的一个独立单位。
2. 线程概念:CPU的基本调度单位(进程不是),换句话说,线程是容器中的执行单位,是进程的可调度实体。
3.资源拥有:相较于线程,进程所使用的系统资源更多,比如进程要加载.exe和.dll文件到地址空间要用到文件资源并且创建虚拟地址空间需要大量系统资源和记录各种相关信息,但是线程使用的系统资源只有内核对象和栈。不同的进程资源相互独立,但在进程内的各个线程是共享进程资源的。所以,换句话说,线程执行开销小,但不利于资源的管理和保护;而进程正相反。
4.一个程序至少有一个进程,一个进程至少有一个线程(主线程必须有),显然线程的划分尺度小于进程,使得多线程程序的并发性高
最后值得再提的是,其实进程和线程的主要差别在于它们的操作系统资源管理方式是不同的。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程只有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉(线程有自己的栈,但没有单独的地址空间。只有进程有自己的地址空间,而这个空间中经过合法申请的部分叫做进程空间。进程空间之外的地址都是非法地址。当一个线程向非法地址读取或者写入,无法确认这个操作是否会影响同一进程中的其它线程,所以只能是整个进程一起崩溃。),所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。


第三题,死锁产生的原因及四个必要条件
产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之
一不满足,就不会发生死锁。
死锁的解除与预防:
理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和
解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确
定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态
的情况下占用资源。因此,对资源的分配要给予合理的规划。




三.综合题

第一题
(台湾某杀毒软件公司面试题):
在Windows编程中互斥量与临界区比较类似,请分析一下二者的主要区别。


第二题:
一个全局变量tally,两个线程并发执行(代码段都是ThreadProc),问两个线程都结束后,tally取值范围。
int tally = 0;//glable
voidThreadProc()
{
for(inti = 1; i <= 50; i++)
tally += 1;
}

第三题:多线程有几种实现方法,都是什么?


第四题:多线程同步和互斥有几种实现方法,都是什么?


第五题:多线程同步和互斥有何异同,在什么情况下分别使用他们?举例说明。


三.综合题


第一题:
在Windows编程中互斥量与临界区比较类似,请分析一下二者的主要区别。

第三题:
子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码。

第四题(迅雷笔试题):
编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。

第五题(Google面试题)
有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:
A:1 2 3 4 1 2....
B:2 3 4 1 2 3....
C:3 4 1 2 3 4....
D:4 1 2 3 4 1....
请设计程序。

下面的第六题与第七题也是在考研中或是程序员和软件设计师认证考试中的热门试题。
第六题
生产者消费者问题
这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,所有生产者和消费者都是异步方式运行的,但它们必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经装满产品且尚未被取走的缓冲区中投放产品。

第七题
读者写者问题
这也是一个非常经典的多线程题目,题目大意如下:有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者读时写者也不能写。

声明:本文虽为转载,但是对问题的解答实属原创
【1】原作者MoreWindows,原文地址:http://blog.csdn.net/morewindows/article/details/7392749


你可能感兴趣的:(VC++)