线程的基本概念以及相关函数
【1】线程的概念
1. 每个用户进程有自己的虚拟地址空间
2. 系统为每个用户进程创建一个
task_struct 来描述该进程 struct task_struct
3. task_struct 和地址空间映射表一起用来表示一个进程
4. 由于进程的虚拟地址空间是私有的,因此进程切换开销很大
5. 为了提高系统的性能,linux引入轻量级进程, 起名为线程
6. 在同一个进程中创建的线程共享该进程的地址空间
7. Linux里同样用task_struct来描述一个线程。
线程和进程都参与统一的调度
总结:
1. 通常线程指的是共享相同虚拟地址空间的多个任务
2. 使用多线程, 大大提高了任务切换的效率
线程不需要虚拟内存,为什么?
每个进程中至少有一个线程,就是主线程,还可以产生多个线程
共享4G内存空间,线程切换只需要虚拟CPU(寄存器)
同样用task_struct来描述一个线程,线程和进程都参于统一的调度
进程代表资源分配的最小单位
线程是最小的调度单位
【2】线程相关的函数
pthread_t tid; //线程号
创建线程
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
/***************************************
*功能:创建线程
*参数:@thread 线程号的地址 &tid
* @attr 线程的属性 默认 NULL
* @start_routine 线程的函数名字
* @arg 传递给线程函数的参数,一般NULL
*返回值: 成功: 0
* 失败: -1 errno
****************************************/
回收线程资源
int pthread_join(pthread_t thread, void **retval);
/***************************************
*功能: 阻塞等待指定线程退出,
* 接收退出状态并回收子线程资源
*参数:@thread 线程号
* @retval 返回值
*返回值: 成功: 0
* 失败: -1 errno值
****************************************/
int pthread_detach(pthread_t thread);
/***************************************
*设置线程为detach,这样线程退出, 资源自动释放,无需使用pthread_join
****************************************/
结束子线程
void pthread_exit(void *retval);
/***************************************
*功能:
*参数:@retval 线程退出时返回的值,可被其他线程通过pthread_join获取
*返回值: 无
****************************************/
注意:
pthread_exit == return
线程传参{
值
地址
}
int pthread_cancel(pthread_t thread);
/***************************************
*功能: 在线程中发送关闭指定线程的请求
*参数:@thread 线程号
*返回值: 成功: 0
* 失败: 负数,更新 errno
****************************************/
优点:线程间很容易进行通信
通过全局变量实现数据共享和交换
缺点:多个线程同时访问共享对象
时需要引入同步和互斥机制
同步和互斥 :保护共享资源,避免竟态
同步:多个任务按理想的顺序/步调来进行
互斥:不能同时访问
都是为了避免竟态:多个任务同时访问共享资源
【3】线程的同步------信号量
sem_t sem;
sem_init(&sem,0,0);//信号量的初始化,,1是进程/0是线程,设置初值为0
sem_wait(&sem);//信号量减1,等于0时阻塞 P 等待
sem_post(&sem);//信号量加1,V 唤醒
P -1 申请资源 任务继续运行 本来就是0 就会阻塞
V +1 释放资源
//主线程等待子线程结束
//计算键盘输入字符串的个数
【4】线程的互斥------互斥锁
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL); //初始化锁
pthread_mutex_lock(&mutex); //加锁
pthread_mutex_unlock(&mutex); //解锁