线程:
轻量级的进程
进程:
重量级的进程
轻量和重量
主要在于 资源的占有
创建 进程和 创建 线程
进程=PCB+|堆|栈|bss|data|text|
线程=线程ID+程序计数器|寄存器集合|栈
线程----进程-----多任务
有了线程:
1.线程 是CPU调度执行 最小单位//侧重作为执行的单位
2.进程 是资源分配的 最小单位(基本单位)//侧重称为一个资源分配的单位
3.线程 的创建和切换(调度)效率高于进程
4.线程 与进程的关系
线程的存在依附于进程,线程是存在于进程的空间的
进程不存在,则线程也不存在了
多个线程共享了进程资源 代码段 数据段 打开的文件等
eg:
工厂
进程----车间
线程---车间中的工人
linux内核中 实际上 是不区分进程和线程
统一叫任务---task
linux为了支持线程编程----linux thread//thread线程
linux系统设计一套 线程函数库---red hat NPTL线程库
就成了事实上的标准了
线程:
1.线程创建-----pthread_create//posix--标准
2.线程执行
3.线程退出
线程创建:
pthread_create
#include <pthread.h>
int pthread_create(pthread_t *thread, //线程id
const pthread_attr_t *attr, //线程属性,NULL默认属=可结合属性(资源回收的方式)
void * (*start_routine) (void *), //线程回调函数(执行函数)
void *arg); //arg表示传递给线程执行函数的一个参数
Compile and link with -pthread.
功能:
创建线程
返回值:
成功 返回0
失败 返回错误码
void * (*start_routine) (void *)
基类型*变量名:
void*do_something(arg-->void*)//函数执行函数 函数类型
int add(int a,int b)//函数的类型
//int (*p)(int,int)
注意:
1.使用线程库时,编译时,需要链接pthread库
gcc thread.c -lpthread
2.线程创建好之后
此时 有两个执行流
一个是主函数所在的执行流---主线程
一个是子线程所在的执行流---子/次线程
3.在线程中,线程之间关系是对等
4.线程共享了进程资源
数据段
全局变量
局部变量
堆区变量
因为共享,如果使用的是同样一个变量
那么多个线程之间会有相互影响
5.线程创建好之后,线程的运行顺序也是不确定的
最终都由操作系统决定。
6.线程共享数据方便
如果是想让 多线程相互影响同一个数据,传参,传地址 并且需要做*运算--文件:
如果 多线程使用同一个初值,但是各自操作各自,那么想办法获得值--文件:
练习:
1.定义一个全局变量
a=1
要求创建两个线程
线程1 让a 每隔1s加1
线程2 让a 每隔1s加2