线程的概念:
线程是进程内部的一条执行序列(执行流),一个进程至少有一条执行序列执行中(执行流),就是主线程(main线程)—>main函数的执行过程。可以通过线程库创建其他多条线程—>函数线程:从制定的函数接口开始运行,到此函数结束为止。
进程与线程的区别:
1,线程是进程内部的一条执行序列,一个进程至少包含一个线程,线程必须依赖于进程。
2,进程是系统资源分配的单位,线程是系统调度执行的单位。
3,进程都是一个独立的个体,一般只研究同一个进程中的线程。
4,进程间通讯需要特殊的技术手段,同一个进程中的线程只需要将传送的数据保存到全局或堆区。
线程的实现方式
1,用户级线程:
线程的管理在用户态
优点:灵活,切换效率高,实现简单
缺点:任一线程阻塞就会使操作系统更换进程
2,内核级线程
操作系统管理线程,线程的调度等
优点:编程简单,任一线程阻塞操作系统更换同一进程的不同线程
缺点:占用内存资源
3,混合级线程
M个用户态线程对应N条内核态线程(M>N)
Linux系统线程库的使用—>libpthread.so
头文件:#include<pthread.h>
线程的创建:
函数定义:
int pthread_create(pthread_t *id,pthread_attr_t *attr, void*(*phread_fun)(void*)fun,void *arg)
/*
参数分别为:
获取创建的线程ID
指定新建线程的属性,默认值为NULL
指定新线程的执行序列(函数)
给新线程指定的函数传递参数
*/
同一个线程之间共享全局的(.data .bss)堆区的数据(.heap)文件资源。
栈区的数据:线程使独有的,不共享。
线程传参:
1.值传递,最大4字节
2.地址传递,在函数线程修改传递的地址空间上的值,主线程中的值也随之改变
main函数所代表的主线程在main函数结束时会调用exit结束进程,其余的函数线程会被强制终止。
线程结束函数:
int pthread_exit(void *result);
result:指定需要传递的结束信息,默认值为NULL。
仅仅结束调用此函数的线程,如果进程中还有其他线程,则这些线程继续执行,直到最后一个线程结束,进程才结束。
等待线程结束函数:—》类似进程中的wait函数
int pthread_join(pthread_t id,void **result)
调用此函数的线程会被阻塞,直到等待的线程结束