线程概念:它是运行在进程内部的的一个基本执行流,多线程的控制流程可以长期并存,一个进程中的数据段和代码段都是被该进程中的多个线程共享的,若定义一个函数,每个线程都可以调用,若定义一个全局变量,每个线程都可以访问。

线程还共享进程的以下内容:1.文件描述符表 2.当前的工作目录 3.用户id(uid)和组id(gid) 4.每种信号的处理方式。

但每个线程还必须有自己的私有部分:1.线程id 2.硬件上下文(硬件寄存器的值,栈指针等) 3.自己的栈空间(运行时的临时数据都要保存在自己的栈空间上) 4.信号屏蔽字(可以进行有选择的的对某些操作进行屏蔽) 5.调度优先级(决定哪个线程优先被调用)6.errno变量


线程与进程的异同:1)进程强调独占资源,而线程强调共享,但线程自己也有自己独立的资源。2)进程之间的通信,共享以及进程之间切换成本大,而线程之间的切换的成本就很小了。3)进程是并发执行的程序在执行过程中分配和管理资源的基本单位(即是承担和分配系统资源的一个基本实体),而线程是实现调度的一个基本实体。4)进程拥有自己独立的虚拟地址空间,而线程是进程中的一个分支,没有自己的地址空间,与进程中的其他线程共享其进程的地址空间。


线程的同步与互斥:

互斥:当多个线程同时读写同一份共享资源的时候,但有些资源只能允许一个线程访问,这就可能会引起冲突。

举个列子:车站售票,当多个售票员同时对车票数据库进行操作时,售出一张车票总数-1,如果同时多个售票员同时进行售票,系统将数据进行-1操作,就出现了错误。

线程同步:一般来说一个线程相对于另一个线程的运行速度是不确定的,即线程在异步环境下运行的,每个线程都会以不可预知的速度推进,但是相互合作的线程需要在某个定点上进行协同合作,当一个线程到达了这些点后,除非另一个线程已经完成了某个操作,否则就必须停下来等待别的线程来完成这些操作

POSIX标准下函数名中以下划线为分隔符

线程的创建:pthread_create(pthread_t *thread,const pthread_attr_t *attr,void*(*start routine)(void *),void *arg);//thread->线程id;attr->线程属性(一般使用线程默认的);void*(*start routine)(void*)->函数指针指向参数为void *函数返回值也为void* 类型的指针;void* arg->传递给线程的参数

pthread.h  创建了三个线程,一个主线程,以阻塞方式等待线程退出

wKioL1cUuUmQQiCqAABj32bikd8347.png



wKiom1cUu-7yDkfgAABxZUVPuKI618.png


让三个线程依次进行创建结果:线程一创建完并释放后线程二创建,之后线程三创建,会出现段错误

wKiom1cUvQ6TL6WFAAA9y5SHQug990.png

wKioL1cUvlLyqXZOAAAjdS3k-cI771.png


若三个线程同时创建:

wKioL1cUv2CQkIroAABXgkV8yso984.png

四种终止线程方式:

1.线程主动终止自己

wKioL1cUwQDDYWPHAAAnaUZBl_k205.png

2.调用pthread_exit(void* retval)函数

wKioL1cUwQDCtbhHAAApdI08ngI410.png

3.用return在线程中返回


wKiom1cUwEORHl93AAAnllUE0cI390.png

4.被其他线程取消

wKioL1cUwQGDv5dtAAAzdQQ_ric383.png