Linux线程
来源:互联网 发布:源码下载easck 编辑:程序博客网 时间:2024/06/06 09:09
概念
- 书面 通常线程指的是共享相同地址空间的多个任务
- 人话 带有时间片的函数
特点
使用多线程的好处
- 大大提高了任务切换效率
- 避免了额外的TLB&cache的刷新
线程共享的资源
- 可执行指令
- 静态数据
- 进程中打开的文件描述符
- 当前的工作目录
- 用户ID
- 用户组ID
线程独占的资源
- 线程ID
- PC(程序计数器)和相关寄存器
- 堆栈
- 错误号(errno)
- 优先级
- 执行状态和属性
linux线程库
安装及更新
- sudo apt-get install manpages-posix-dev manpages-posix
pthread线程库提供了如下基本条件
- 创建线程
- 回收线程
- 结束线程
同步和互斥机制
- 信号量
- 互斥锁
- 条件变量
基本函数
创建线程 pthread_create
int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*routine)(void *),void *arg);//返回值:成功返回0,失败返回错误码//参数:thread 线程对象attr 线程属性,NULL代表默认属性routine 线程执行的函数arg 传递给routine的参数
回收线程 pthread_join
int pthread_join(pthread_t threa,void **retval);//功能调用线程阻塞直到thread结束//返回值成功返回0,失败时返回错误码//参数*retval接收线程thread的返回值thread要收回的线程对象
结束线程 pthread_exit
void pthread_exit(void *retval);//功能结束当前线程,线程私有资源被释放//参数retval不能是局部变量retval可被其他线程通过pthread_join获取
同步和互斥
同步机制
- 同步(synchronization)指的是多个任务按照约定的先后次序相互配合完成一件事情
- 由信号量来决定线程是继续运行还是阻塞等待
互斥机制
- 临界资源 一次只允许一个任务(进程、线程)访问资源
- 临界区 访问临界资源的代码
pthread_mutex互斥锁,就是互斥机制
线程实现同步互斥的方法
线程互斥锁
- 锁属于互斥机制
- 基本函数
- 初始化锁 pthread_mutex_init();
- 互斥锁上锁 pthread_mutex_lock();
- 判断互斥锁上锁 pthread_mutex_trylock();
- 互斥锁解锁 pthread_mutex_unlock();
- 消除互斥锁 pthread_mutex_destroy();
条件变量
属于同步机制
基本函数
- 初始化 pthread_cond_init();
- pthread_cond_init(条件变量ID,属性);
- 等待资源 pthread_cond_wait();
- pthread_cond_wait(条件变量ID,锁的ID);
- 必须搭配锁来使用
- 告知资源到达 pthread_cond_signal();
- 初始化 pthread_cond_init();
等待操作包含的几个步骤
- 解锁
- 进入等待状态
- 资源到达
- 加锁
信号量
概念
- 信号量代表某一类资源,其值表示系统中该资源的数量
- 信号量是一个受保护的变量
- 初始化
- P操作(申请资源)
- V操作(释放资源)
Posix信号量
- 无名信号量(基于内存的信号量)
P/V操作
- P(S)含义如下
- 如果信号量的值大于0,线程获得资源(信号量-1)且线程继续运行不会阻塞
- 如果信号量等于0,线程无法获得资源且阻塞在那里
- V(S)含义如下
- 线程释放资源(信号量+1)
- 如果有任务等待资源,则唤醒等待任务,让其继续运行。
- P(S)含义如下
进程和线程的不同点
0 0
- linux 线程 线程属性
- linux 线程 线程同步
- linux 线程
- linux线程
- Linux 线程
- linux 线程
- linux线程
- Linux “线程”
- Linux线程
- linux 线程
- linux 线程
- linux线程
- linux 线程
- linux--线程
- Linux线程
- linux 线程
- linux 线程
- linux线程
- 错误:Error:Configuration with name 'default' not found.
- 前台传入后台中文乱码
- css 实现div内显示两行或三行,超出部分用省略号显示
- Linux下安装JDK
- Hadoop之HDFS的读写流程(四)
- Linux线程
- Java 中switch语句所支持的类型
- 【matlab】数据类型一(整型、浮点、逻辑、字符)
- RTSP协议
- Java中的private、protected、public和default的区别
- 【Inno Setup】Compression 压缩字段
- 学习网络图___LSTM
- 抓包工具Fiddler的使用教程(十六):AutoResponder功能使用的小技巧
- Android数据存储之SharedPreferences及如何安全存储