当前位置:网站首页>线程学习笔记
线程学习笔记
2022-07-22 08:39:00 【Lewin~】
一、线程概述
1.1 线程的概念
每个进程都有自己的地址空间,这就造成进程在创建、切换、撤销时,需要较大的系统开销。 为了减少系统开销,从进程中演化出了线程。 线程存在于进程中,共享进程的资源。 线程是进程中的独立控制流,由环境(包括寄存器组和程序计数器)和一系列的执行指令组成。每个进程都有一个地址空间和一个控制线程。
1.2 线程和进程的比较
线程是CPU调度和分派的基本单位,进程是系统中程序执行和资源分配的基本单位,进程是线程的容器,一般把线程可以看作是轻量级的进程
一个进程可以创建多个线程,多个线程共享一个进程的资源
每一个进程创建的时候系统会给其4G虚拟内存,3G用户空间是私有的,所以进程切换时,用户空间也会切换,所以会增加系统开销,而一个进程中的多个线程共享一个进程的资源,所以线程切换时不用切换这些资源,效率会更高
线程的调度机制跟进程是一样的,多个线程来回切换运行,即时间片轮转,上下文切换
二、线程的相关API
包含头文件:#include <pthread.h>
创建子线程: pthread_create()
等待子线程退出: pthread_join()
线程分离:pthread_detach()
线程退出:pthread_exit()
线程的取消: pthread_cancel()
设置线程是否可以被取消:pthread_setcancelstate()
设置线程的取消点:pthread_testcancel()
设置线程的是立即取消还是运行到取消点后取消: pthread_setcanceltype()
注册线程退出清理函数:pthread_cleanup_push()
将线程清理函数运行并弹出栈: pthread_cleanup_pop()
三、注意事项
与fork不同的是pthread_create创建的线程不与父线程在同一点开始运行,而是从指定的函数开始运行,该函数运行完后,该线程也就退出了。
线程依赖进程存在的,如果创建线程的进程结束了,线程也就结束了。
线程函数的程序在pthread库中,故链接时要加上参数-lpthread
linux线程执行和windows不同,pthread有两种状态:
可结合的(joinable)或者是分离的(detached),线程默认创建为可结合态。
(1)如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之后这些资源才会被释放。
(2)若是detached状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放,使用pthread_detach函数将线程设置为分离态。
(3)创建一个线程后应回收其资源,但使用pthread_join函数会使调用者阻塞,故Linux提供了线程分离函数:pthread_detachpthread_cancel函数的实质是发信号给目标线程thread,但发送成功并不意味着目标线程一定就会终止,取决于线程的取消属性
和进程的退出清理一样,线程也可以注册它退出时要调用的函数,这样的函数称为线程清理处理程序(thread cleanup handler)。
(1)注意:线程可以建立多个清理处理程序。 处理程序在栈中,故它们的执行顺序与它们注册时的顺序相反。
(2)当线程执行以下动作时会调用清理函数:
1、调用pthread_exit退出线程。 2、响应其它线程的取消请求。
3、用非零execute调用pthread_cleanup_pop
边栏推荐
- 会议OA项目之会议发布功能
- MySQL数据库结合项目实战SQL优化总结
- GBase8s数据库MINUS 运算符
- QT exe只允许运行单个
- Super practical transformation strategy: 2022 central state-owned enterprise cloud native landing practical guide was officially released
- QT笔记——操作Execl
- Use of bullets in object pool mode in aircraft war
- Industrial Internet security situation prediction method integrating attention mechanism and bsru
- Rk3399 platform development series explanation (alsa subsystem) 4.37, alsa driven framework
- QT笔记——QJson
猜你喜欢
Aruba学习笔记04-Web UI --Configuration面板介绍
如何破解IT中年危机下的惨淡人生
需要达到什么水平,程序员才能顺利拿到20k月薪无压力?
QT笔记——eventFilter事件过滤器
【Rust】为什么我建议你学一下 Rust | Rust 初探
[3D target detection] sparse convolution
Microsoft SQL Server数据库语言及功能使用(十二)
【Rust】我该用什么软件开发 Rust | 常用支持 Rust 的编辑器推荐
水博士
QT notes - unpolish() and polish() of QT dynamic attributes
随机推荐
JS String charAt substring() substr slice toUpperCase toLowerCase indexOf
Anaconda 环境迁移
如何消除 MySQL表中的字段特别设置的字符集和排序规则?
Microsoft SQL Server数据库语言及功能使用(十二)
QT笔记——eventFilter事件过滤器
go fmt包详解
力扣练习——24 去除重复字母
SQL多条件查询无法实现
QT笔记——实现窗体自适应
云原生强势发展,企业该如何抓住业务机遇
Gbase8s database set connection statement
【Rust】我该用什么软件开发 Rust | 常用支持 Rust 的编辑器推荐
GBase8s数据库SET Database Object Mode 语句
MySQL数据库结合项目实战SQL优化总结
QT notes - vs generating multiple exe files for a project
go 并发编程之-工作池
Learn TB writing method with SPI simulation file
prosody相关概念了解。xmpp,jabber,bosh等
Verilog basic syntax (2)
Gbase8s database comparison performed by database objects