线程
来源:互联网 发布:摩尔定律失效 知乎 编辑:程序博客网 时间:2024/06/17 14:20
一、线程
1、概念 进程内部的一条执行序列。进程内部至少有一条执行线程,即main函数的执行体。进程内部可以有多条线程,main函数的线程称之为主线程,其他线程称之为函数线程。函数线程是由主线程通过系统调用函数创建的。
2、与进程的区别:
(1)进程是资源分配的最小单位,线程是调度(执行)的最小单位
(2)第9点
(3)线程切换比进程切换消耗小
3、线程的分类:
(1)用户级:在用户空间是多线程,内核只识别进程整体。线程创建、管理、销毁都是由用户空间负责,用户通过调用库函数再完成。
(2)内核级:线程的创建、控制、销毁都是由内核实现的,每个线程对内核都是可见的。
(3)组合模型:一部分是用户级,一部分是内核级线程。介于内核级和用户级之间,用户态创建多个线程,内核看到的也是多个,只是这是中m:n的对应关系。
4、线程的创建:
通过库函数可以创建线程
#include<phread.h>
int pthread_create(pthread_t * id, pthread_attr * attr, void*(*pthread_fun)(void*), void* agr);
id: 线程的编号。由系统自动填充;
attr: 线程属性
pthread_fun: 线程创建以后所调用的函数地址;
arg: 传递给函数线程的参数
总结: [1] pthread_create 函数是库函数,编译的时候必须加载其动态库。
[2] 和写一个普通的函数没有明显的差异。只不过是在主线程不会调用函数,而是在创建线程的时候指定 函数线程执行的代码入口地址(即就是函数的地址)。称主函数为主执行序列,函数的执行为函数线 程执行流。
[3]主线程和函数线程同时执行,一个进程同时执行多个任务。
5、线程的运行特点:
所有线程同时运行
6、线程退出:
exit 是结束进程的函数,主线程要结束,但是函数线程还在运行,我们主线程就不能调用 exit 结束,必须使用: void pthread_exit(void *reval);
7、线程等待其他线程结束:
int pthread_join(pthread_t id, void**p);
作用: 获取指定线程由 pthread_exit 设置的退出信息。
特性: pthread_join 函数会阻塞直到等待的线程退出。(类比进程控制中的 wait 函数)
8、给函数线程传递参数
i. 传值
将变量的值强转成 void* ,函数线程中,对 arg 的值强转成变量的类型。
ii. 传地址
将变量的地址强转成 void*,函数线程中,对 arg 的值强转成变量类型的指针,再去取值。
注意:: 如果是传递变量地址,获取变量值时,必须考虑变量的值是否被改变。
9、线程间的数据共享:
全局变量 共享
栈区数据 不共享
堆区 共享
文件: 共享 同一个进程的线程,使用一个 PCB,只要线程能拿到打开的文件的文件描述符,就可以通过文件 描述符操作文件。
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程池的基本使用
- java中数组常用方法总结
- java中的基本类
- 【设计模式】-抽象工厂
- POJ1009:Edge Detection
- 线程
- 基于ssm框架的个人博客(7)--博客类别管理(增、删、改、刷新)
- linux编译ko文件(不同内核源码版本)
- 利用MyEclipse开发JavaWeb程序
- Linux驱动静态编译和动态编译方法详解
- 006_Java中的过滤器Filter的使用
- RoboBinding(MVVM)框架介绍
- Go语言,struct结构体的那些奇怪的用法
- 深入MTK平台bootloader启动之【 Pre-loader -> Lk -> kernel】