1.线程和进程的区别:
说到线程就必须说到进程,我们知道进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小
单元;是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。
而线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一
个进程的其他的线程共享进程所拥有的全部资源。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执
行路径。
线程有自己的堆栈和局部变量,但线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序
要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某
些变量的并发操作,只能用线程,不能用进程。
2.多线程的优点:(1)和进程相比,它是一种非常“节俭”的多任务操作方式.在Linux系统下,启动一个新的进程必须分配给它独立的地
址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。
(2)线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过进程间通信
的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个
线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。
(3)使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
(4)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程
序会利于理解和修改。
3.多线程的缺点:(1)等候使用共享资源时会使程序的运行速度变慢,这些共享资源主要是独占性的资源。
(2)对线程进行管理要求额外的CPU开销。线程的使用会给系统带来上下文切换的额外负担,当这种负担超过一定
程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。
(3)线程的死锁。即较长时间的等待或资源竞争,以及死锁等多线程症状。(4)对公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存
放的数据,从而使前一个线程的参数被修改;另外,当公有变量的读写操作是非原子性时,在不同机器上,中断时间
的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知
的。
4.线程的实现
(1)线程的实现函数:
pthread_create
函数的功能:创建一个线程
函数的原型:int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine)(void *),void *arg);函数的参数:thread:线程的标识符
attr:NULL(线程的属性)start_routine:线程执行的函数
arg:传递到线程的参数返回值:成功返回0,出错返回错误码
头文件:#include <pthread.h>
(2)线程的退出函数:
pthread_exit函数的功能:终止线程
函数的原型:void pthread_exit(void *retval)函数的参数:retval:线程结束的返回值
头文件:#include <pthread.h>
(3)等待线程终止函数
pthread_join函数的功能:等待线程退出
函数的原型:int pthread_join(pthread_t th,void **thread)函数的参数:th:线程的标识符
thread:线程结束时的返回值返回值:成功返回0,出错返回错误码
头文件:#include <pthread.h>