多线程
线程概念
使用多线程的理由之一相比进程,他是一种非常节俭的多任务操作方式。启动一个新的进程必须分配给他一个独立的地址空间,而进程中的多个线程,他们彼此使用相同的地址空间,共享大部分数据。
理由二是线程间的通信机制,进程具有独立的数据空间,线程不然,由于同一个进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其他线程所用。
什么是线程
轻量级的进程,本质仍是进程。
进程:有独立的PCB,且有独立的地址空间
线程:有独立的PCB,没有独立的地址空间
进程与线程的区别:
地址空间:线程共享本进程的地址空间,而进程之间是独立的地址空间。
资源:线程共享本进程的资源,不利于资源的管理与保护,而进程之间的资源是独立的,能很好的进行资源管理和保护。
健壮性:多进程要比多线程健壮,一个进程奔溃后,在保护模式下不会对其他进程产生影响,但一个线程崩溃整个进程都死掉。
执行过程:每个独立的进程有一个程序运行的入口,顺序执行列和程序入口,执行开销大。但线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,执行开销小。
可并发性:两者都可以。
切换时:进程切换时,消耗的资源大,效率低。所有涉及到频繁的切换时,使用线程要好于进程。
线程共享资源
1.文件描述符表 2.每种信号的处理方式 3.当前工作目录 4.用户ID和组ID 5.内存地址空间(.text/.data/.bss/heap/共享库)、共享全局变量
线程非共享资源
1.线程id(线程标识符) 2.处理器现场和栈指针(内核栈) 3.独立的栈空间(用户空间栈) 4.errno变量 5.信号屏蔽字 6.调度优先级
线程优缺点
优点:1.提高程序并发性 2.开销小 3.数据通信、共享数据方便。
缺点:1.属于库函数,不稳定 2.调试、编写困难、gdb 不支持 3.对信号支持不好。
线程控制原语
pthread_self函数
获取当前程序的线程ID。
pthread_t pthread_self(void)
返回值: 成功:调用的线程ID 失败:无!。
pthread_creqate函数
创建一个新的线程。
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start routine) (void *), void *arg);
返回值: 成功:0; 失败:错误号 -------Linux 环境下,所有线程特点,失败均直接返回错误号
参数: pthread_t:当前Linux中可理解为: typedef unsigned long int pthread_t ;
参数1:传出参数,保存系统为我们分配好的新线程ID。 参数2:线程属性,通常传NULL,表示使用线程默认属性。若想使用具体属性也可以修改该参数。 参数3:回调子线程函数名 参数4:参3子线程函数需要的参数,没的话传NULL.
注意:编译时增加参数 -lpthread