1.线程的概念:
线程是轻量级的进程,是进程内部的一条执行序列(一组有序指令),或者说是执行流,一个进程至少有一条线程,即就是main函数所代表的执行序列称之为主线程,通过线程库可以创建线程。
2.线程与进程的区别:
(1)进程是资源分配的单位,线程是CPU调度执行的单位。
(2)多进程,进程间资源都是独立的,同一进程内的线程是资源共享的。
(3)线程更加轻便,更小巧,线程创建调度,切换效率高。
3.linux系统中线程库的使用:
#include<pthread.h>
创建线程:
int pthread_create(pthread_t *id,pthread_attr_t *attr,void* (*pthread_fun)(void *),void *arg);
id:线程ID,线程创建时分配的线程ID,传递一个变量的地址;
attr:线程属性,默认为NULL;
pthread_fun:线程函数,新创建的线程的执行体,函数地址,指定新线程开始的地方。
返回值:成功返回0,失败返回错误码。
同一进程中的线程都是并发执行的,并且线程的执行顺序是不一定的,由系统决定。
轻量级主要体现在:
(1)资源:创建(2)调度:快
线程必须依赖于进程,进程结束,所以线程随之结束。
4.创建时给函数线程传参的两种方式:
(1)值传递–最多传递四个字节的数据,指针。将传递的值直接强转为 void 星,arg:类型时void星,记录的时传递的值。
(2)地址传递:将传递的值的地址转化为void 星,arg:类型是void 星,记录的是传递的地址。
结束线程:
void pthread_exit(void *reval);
等线程结束,获取线程退出信息:
int pthread_join(pthread_t id,void **retval);
取消一个线程:只是发出取消请求,并不会阻塞。
int pthread_cancel(pthread_t id);
主线程后期对值的修改可能影响函数进程中获取值,函数进程中通过地址对变量修改,也会影响主线程中变量的值。
线程的实现方式:用户级、内核级、混合级
(1)用户级线程:内核并不支持多线程,多线程是用户态实现,用户代码就必须实现线程的创建、调度、销毁等工作。
//内核只能识别出是一个进程
优点:内核简单、线程切换速度快、每次切换不用陷入内核。
缺点:用户代码复杂、如果一条线程阻塞,则整个进程阻塞。
(2)内核级线程:linux
进程中的数据区域、堆区,多线程都是共享的,创建线程只会在进程的资源中申请栈区资源,用于线程函数的执行。
5.多线程的数据共享
(1)全局 共享 同一进程中的多个线程共享进程的4G虚拟空间
(2)栈区 不共享
(3)堆区 共享
(4)文件描述符 共享
怎样使得数据共享:
(1)将数据定义到全局。
(2)将数据保存到堆区。
(3)创建线程时,将栈区数据地址传给线程函数。