Linux 多线程编程

来源:互联网 发布:100日内成本 的源码 编辑:程序博客网 时间:2024/04/30 01:34

1. 什么是线程

线程是进程的一个实体,是CPU调度和分配的基本单位,它是比进程更小的能独立运行的基本单位,一个进程可以包含多个线程

2. 线程里的内容

一个指向当前被执行命令的指令指针一个栈一个寄存器值的集合,定义了一部分描述正在执行线程的处理器状态的值一个私有的数据区

3. 线程与进程的区别

一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

4.多线程开发的基本概念

1.线程,又分创建,退出,等待

2.互斥锁,包括创建,销毁,加锁和解锁

3.条件操作,包括创建,销毁,触发,广播和等待。

 

5.死锁以及相应的解决方法

死锁就是当一个或多个进程都在等待系统资源,而资源本身又被占用时,所产生的一种状态;

死锁的产生是必须要满足一些特定条件的:互斥条件;请求和保持条件;不剥夺条件;循环等待条件

要预防和避免死锁的发生,只需将上面的4个条件破坏掉其中之一即可。

6.什么是线程的继承性

子线程继承主线程的属性。进程中的所有信息对该进程的所有线程都是共享的:可执行的程序文本,程序的全局内存,堆内存,栈,文件描述符;信号的处理是进程中所有线程共享的。(如果信号的默认处理是中止该进程,那么即使把信号传给某个线程也一样会将进程杀掉)

7.pthread_exitexit的区别什么

当初始线程从main()调用返回时或调用exit()时,整个进程及其所有的线程都将中止。在其他线程调用exit()也会中止整个进程

如果主线程仅仅调用了pthread_exit,则仅主线程本身中止,进程及进程内的其他线程将继续存在。所有线程都已中止时,进程也将中止

8.多进程与多线程的比较

多线程比多进程成本低,但性能更低

多线程优点:无需跨进程边界;程序逻辑和控制方式简单;所有线程可以直接共享内存和变量等。缺点:每个线程与主程序共用地址空间,受制于GB地址空间,线程之间的同步与加锁控制比较麻烦;一个线程的崩溃可能影响整个程序的稳定性;到达一定的线程数程度后,即便再增加CPU也无法提高性能

多进程优点:每个进程独立,不影响主程序的稳定性;通过增加CPU,就可以扩充性能;可以尽量减少线程加锁/解锁的影响,极大提高性能。缺点:逻辑控制复杂,需要和主程序交互;需要跨进程边界;调度开销比较大

9.什么是条件变量,它有什么作用?

   条件变量是线程可用的另外一种同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定条件的发生。条件本身是由互斥量保护的。线程在改变状态前必须首先锁住互斥量,其它线程在获得互斥量之前不会觉察到这种变化。

10. 互斥锁

1)先初始化锁init()或静态赋值pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIER
attr_t有:
PTHREAD_MUTEX_TIMED_NP:其余线程等待队列
PTHREAD_MUTEX_RECURSIVE_NP:嵌套锁,允许线程多次加锁,不同线程,解锁后重新竞争
PTHREAD_MUTEX_ERRORCHECK_NP:检错,与一同,线程请求已用锁,返回EDEADLK;
PTHREAD_MUTEX_ADAPTIVE_NP:适应锁,解锁后重新竞争
(2)加锁,lock,trylock,lock阻塞等待锁,trylock立即返回EBUSY
(3)解锁,unlock需满足是加锁状态,且由加锁线程解锁
(4)清除锁,destroy(此时锁必需unlock,否则返回EBUSY,//Linux下互斥锁不占用资源内存