多线程常见的问答题

来源:互联网 发布:青岛软件开发 编辑:程序博客网 时间:2024/05/22 06:16

麻麻说转载要注明出处:http://blog.csdn.net/morewindows/article/details/7392749,(经过本人整理)

一.概念性问答题

第一题:线程的基本概念、线程的基本状态及状态之间的关系?

 线程是进程的执行单位,又称为轻量级进程,线程只拥有一些必须的基本资源,线程共享进程的资源:如地址空间,内存,等等,线程是操作系统调度的基本单位,可以并发执行。线程的基本状态有:运行,阻塞,就绪。从就绪态转到运行态,从运行态转到阻塞态,从运行态到就绪态,从阻塞态到就绪态。Linux下创建一个线程使用的是pthread_create(pthread_t &id, pthread_attr_t *attr, void *(*begin_thread)(void*),void *param).

第二题:线程与进程的区别?

      线程和进行的区别有:

1、线程是程序执行的基本单位,线程是操作系统调度的基本单位。

2、线程的调度和切换比进程要容易的多。

3、线程只拥有一些需要执行的基本资源,进程拥有大部分的资源,如文件,地址空间等等。

4、进程之间不共享地址空间,线程之间共享地址空间

第三题:多线程有几种实现方法,都是什么?(在网上收到的都是java实现多线程的两种方法)

Linux创建线程函数的函数名为pthread_create;

 多线程的实现方法有两种:

1、用户级线程:操作系统提供一个库,所有关于多线程的操作都是在用户态下进行的,典型的如Soloris。为用户提供一个简明的同步并行编程环境,加入原文线程库将用户的同步请求转化成对操作系统的异步请求,用户级线程的调度算法和调度过程全部由用户自行选择和确定,由用户级线程库实现,与操作系统内核无关,因而不需操作系统内核的特殊支持,用户级线程的调度算法只进行线程上下 文切换而不进行处理机切换,且其线程上下文切换是在内核不参与的情况下进行的,即线程上下文切换只是在用户栈、用户寄存器等之间进行切换,不涉及处理机的状态,无运行模式的切换开销。新线程通过程序调用指针的变化使得程序计数器变化而得以执行,因而系统开销小。不能实现进程内线程在多处理机上真正并行运行。如果系统拥有多个处理机而操作系统的调度单位是进程,无法感知进程内多线程存在,因而无法使用户进程在多处理机上同时运行

2、内核级线程:操作系统本身实现了多线程,典型的如windows NT。可以支持进程内多线程在多处理机上真正并行执行;可以支持进程内多线程在多处理机上真正并行执行;核心级线程不会出现进程处于阻塞或等待状态,而线程处于执行状态的情况,核心级线程比用户级线程开销要大一些,因为核心级线程的管理都由内核程序进行,需要运行模式的切换。

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

1、互斥量

Linux环境下使用pthread_mutex_t数据类型表示互斥量,

使用pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr *restrict attr)进行初始化,

加锁有两种pthread_mutex_lock(pthread_mutex_t *restrict mutex);pthread_mutex_trylock(pthread_mutex_t *restrict mutex);

释放锁为pthread_mutex_unlock(pthread_mutex_t *restrict mutex);

2、读写锁

        linux下使用pthread_rwlock_t表示读写锁,
初始化为pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
释放锁为pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
获取读锁为pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
获取写锁为pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
释放锁为pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

3、信号量

sem_t

4、条件变量

pthread_cond_t

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

 同步包含互斥,互斥更强烈一些,只能有一个线程在访问某个共享资源,同步强调多个线程的合作。

二.选择题

第一题(百度笔试题):

以下多线程对int型变量x的操作,哪几个不需要进行同步: 
A. x=y;      B. x++;    C. ++x;    D. x=1;

 B,C放一块不需要同步

第二题(阿里巴巴笔试题)

多线程中栈与堆是公有的还是私有的

A:栈公有, 堆私有

B:栈公有,堆公有

C:栈私有, 堆公有

D:栈私有,堆私有

 

三.综合题

第一题(台湾某杀毒软件公司面试题):

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

 临界区不能用于进程间同步, 它不属于内核对象, 所以速度比较快
互斥量可以用于进程间同步, 属于内核对象, 速度较慢

第二题:

一个全局变量tally,两个线程并发执行(代码段都是ThreadProc),问两个线程都结束后,tally取值范围。

inttally = 0;//glable

void ThreadProc()

{

       for(inti = 1; i <= 50; i++)

              tally += 1;

}

 

第三题(某培训机构的练习题):

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

 

第四题(迅雷笔试题):

编写一个程序,开启3个线程,这3个线程的ID分别为ABC,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC.依次递推。

 

第五题(Google面试题)

有四个线程1、234。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:

A1 2 3 4 1 2....

B2 3 4 1 2 3....

C3 4 1 2 3 4....

D4 1 2 3 4 1....

请设计程序。

 

下面的第六题与第七题也是在考研中或是程序员和软件设计师认证考试中的热门试题。

第六题

生产者消费者问题

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


第七题

读者写者问题

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

原创粉丝点击