多线程编程

来源:互联网 发布:电脑淘宝安全中心 编辑:程序博客网 时间:2024/06/03 23:46

一.进程与线程的区别

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

(六)进程是资源分配的最小单位,线程是程序执行的最小单位。进程拥有独立的地址空间,而线程没有,同一进程内的线程共享进程的地址空间。

二.进程与线程的关系

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

三.信号量与互斥量的区别

(一) 互斥量用于线程的互斥,信号线用于线程的同步。  这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。  

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。  
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源  
(二) 互斥量值只能为0/1,信号量值可以为非负整数。  
一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。  
(三)互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

四.线程的优点

(一)和进程相比,它是一种非常“节俭”的多任务操作方式.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。运行于一个进程中的多个线程,它们之间使用相同的地址空间,而且线程间彼此切换所需的时间也远远小于进程间切换所需要的时间.据统计,一个进程的开销大约是一个线程开销的30倍左右。
(二)线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过进程间通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。
(三)使多CPU系统更加有效.操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
            改善程序结构.一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

五.线程的创建

函数格式:int pthread_create(pthread_t * tidp,const pthread_attr_t*attr,void*(*start_rtn)(void),void*arg)
参数说明:tidp:线程id
                    attr: 线程属性(通常为空)
                    start_rtn:线程要执行的函数
                    arg:start_rtn的参数

六.线程的终止

函数格式:void pthread_exit(void * rval_ptr)
参数说明:Rval_ptr:线程退出返回值的指针
七.线程等待
函数格式:int pthread_join(pthread_t tid,void **rval_ptr)
参数说明:Tid :等待退出的线程id
                    Rval_ptr:线程退出的返回值的指针
八.互斥量的创建及加锁解锁
(一)创建
 函数格式:int pthread_mutex_init(pthread_mutex_t 、*mutex,const pthread_mutexattr_t *attr)
                     int pthread_mutex_destroy(pthread_mutex_t *mutex)
(二)加锁
函数格式:int pthread_mutex_lock(pthread_mutex_t *mutex)
                    int pthread_mutex_trylock(pthread_mutex_t *mutex)
(三)解锁
函数格式:int pthread_mutex_unlock(pthread_mutex_t *mutex)

原创粉丝点击