【Linux】线程控制

这篇具有很好参考价值的文章主要介绍了【Linux】线程控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 进程 VS 线程

1. 进程和线程

1.进程是资源分配的基本单位
2.线程是调度的基本单位
3.线程共享进程数据,但也拥有自己的一部分数据

线程id (LWP)


一组寄存器
(当前线程所对应执行的上下文数据) 因为多线程是要被切换,所以它的上下文数据为私有的,不能和其他发生冲突



每一个线程都有自己独立的栈结构
若每一个线程都有一个临时变量,则将所有的临时变量数据都放入地址空间的栈中,就会导致数据谁是谁的分不清楚
所以线程在处理临时数据时就要有自己独立的栈


errno (错误码)
信号屏蔽字
调度优先级

2.进程的多个线程共享

同一地址空间中,代码区 ,数据区都是共享的,
若定义一个函数,在各线程都可以调用
定义一个全局变量,在各线程处都可以访问到


各线程还共享如下的进程资源和环境:
1.文件描述符表
主线程打开一个文件,然后又创建了一个新线程,新线程可以看到主线程打开的文件,同样也可以读取文件描述符

不懂查看:文件描述符本质理解


2.每种信号的处理方式
SIG_IGN SIG_DFL 自定义处理信号处理函数
3.当前工作目录
4.用户id 和组id

2. 线程控制

1.为什么使用线程要调用库?

操作系统视角:Linux下们没有真正意义的线程,而是用进程模拟的线程(LWP),Linux 不会提供直接创建线程的系统调用,最多提供创建轻量级进程的接口

用户视角:用户只认线程


用户和操作系统之间需要 库 , 被称为 用户级线程库 (pthread), 任何系统都需要自带,即原生线程库
对操作系统 将Linux接口封装
对 用户 提供进行线程控制的接口


【Linux】线程控制

在创建makefile时,是需要将加入 pthread 库的,使操作系统对接口进行封装,使用户可以识别到线程

2. pthread_create —— 线程创建

输入 man pthread_create

【Linux】线程控制

第一个参数 为 线程id
第二个参数为 线程的属性 一般设为nullptr
第三个参数为 函数指针
新线程会执行新的方法,主线程会继续向后执行,两个执行流会各自执行各自的
第四个参数 ,当要回调方法时 arg作为函数指针传递的参数

进程创建成功为0,失败为错误码


【Linux】线程控制

让多个线程执行同一个函数 thread_run
使用snprintf,将字符串"thread -i"传入 tname中
调用 pthread_create时,将tname传过去作为 自定义函数 thread_run 的参数
再通过name将字符串"thread -i" 在线程中打印出来


【Linux】线程控制
当创建出来一个线程时,该线程对应的tname缓冲区属于多个线程共享的
传递的参数并非缓冲区本身,而是缓冲区的起始地址

当在自定义函数中 通过name拿到缓冲区的起始地址
主线程创建新线程之后,主线程会继续运行时,重新对缓冲区的内容进行覆盖
覆盖后,并没有改变在上一个线程传递的起始地址,即name没有变化,但是内容为缓冲区更新后的


【Linux】线程控制

将空间开辟在堆上,即可解决这个问题


【Linux】线程控制

运行可执行程序后,每个线程都有对应的数字存在
循环多少次,new就会执行多少次,随着每一次的new,传递给新线程的起始地址就只属于该线程

3. pthread_join —— 线程等待


输入 man pthread_join

【Linux】线程控制

第一个参数为 线程id
第二个参数为 是一个输出型参数 可以拿到新线程的退出结果
成功返回0,失败返回错误码


等待方式默认是阻塞的,若新线程没有退出, 主线程就一直等待,直到新线程退出


【Linux】线程控制
【Linux】线程控制

运行可执行程序,虽然主线程没有写死循环,但是程序会一直循环跑下去
主线程并不会退出,因为它要等待新线程退出

3. 线程终止

1. 线程函数执行完毕

【Linux】线程控制

在自定义函数中,使用return 退出


【Linux】线程控制

【Linux】线程控制

运行可执行程序后,出现 all thread quit 代表 线程全部退出了

2. pthread_exit


输入 man pthread_exit

【Linux】线程控制

参数类型为void*
自定义函数的返回类型为void*,所以可以把自定义函数的返回值拿回来


【Linux】线程控制

通过 pthread_exit 将新线程的退出信息返回
新创建一个ret的指针变量,虽然是void*类型,但是也会开辟空间
由 pthread_join 的第二个参数 ret去接收返回值的


【Linux】线程控制

由于1是int类型,而自定义函数是void*类型,所以需要强转
再把强转后的1 传给了 ret,再通过强转把1打印出来


【Linux】线程控制

每个线程都打印出 thread quit : 1

4. pthread_cancel——线程取消

输入 man pthread_cancel

【Linux】线程控制

参数为 线程id


【Linux】线程控制

在休眠3秒后,当前线程被取消


【Linux】线程控制

新线程有5秒的数据,但是只执行了3秒,主线程 取消了新线程

5. pthread_self——获取线程id

输入 man pthread_self

【Linux】线程控制
【Linux】线程控制
【Linux】线程控制

运行可执行程序后,发现在主函数中直接使用对应 线程求的值与自定义函数调用pthread_self 对应值 是相同的,
说明 pthread_self 就是用来获取线程的id
文章来源地址https://www.toymoban.com/news/detail-456979.html

到了这里,关于【Linux】线程控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PCIe简介/体系架构/工作原理/资源分配/错误定位

    目录 一、PCIe简介 二、体系结构 三、层次结构 四、工作原理 五、不同版本及传输速率、吞吐量 六、资源分配 ID资源 PCIe资源分配原理 七、Lane和Link PCIe插槽 八、MSI和MSI-X 九、SR-IOV 十、AER 十一、lspci命令 PCIe(Peripheral Component Interconnect Express)是一种用于连接计算机内部硬件

    2024年02月16日
    浏览(46)
  • 6-1 求解资源分配问题(动态规划法)[PTA]

    6-1 求解资源分配问题(动态规划法) 某公司有3个商店A、B、C,拟将新招聘的5名员工分配给这3个商店,各商店得到新员工后,每年的赢利情况如下表所示,求分配给各商店各多少员工才能使公司的赢利最大。 函数接口定义: 裁判测试程序样例: 输入格式: 第一行输入商店数

    2024年02月12日
    浏览(74)
  • 如何通过物联网实现农业资源的精准分配?

    作者:禅与计算机程序设计艺术 近年来,随着互联网、传感网、物联网等新型信息技术的飞速发展,越来越多的人们开始关注“物联网+农业”这一领域,它将传统的信息采集、汇聚、传输、分析等过程融入到现代化生产的环节中。“物联网+农业”系统可以将各类传感器数据

    2024年02月08日
    浏览(75)
  • 【管理运筹学】第 8 章 | 动态规划(3,资源分配问题)

    【管理运筹学】第 8 章 | 动态规划(1,多阶段决策过程与动态规划基本概念) 【管理运筹学】第 8 章 | 动态规划(2,动态规划的基本思想与模型求解) 【管理运筹学】第 8 章 | 动态规划(3,资源分配问题) 【管理运筹学】第 8 章 | 动态规划(4,生产与储存问题) 【管理

    2024年02月04日
    浏览(47)
  • 深度强化学习与人工智能:如何实现高效的资源分配

    深度强化学习(Deep Reinforcement Learning, DRL)是一种人工智能技术,它结合了深度学习和强化学习两个领域的优点,以解决复杂的决策问题。在过去的几年里,DRL已经取得了显著的成果,例如在游戏、机器人控制、自动驾驶等领域的应用。在资源分配方面,DRL可以帮助企业更有效地

    2024年02月21日
    浏览(70)
  • 操作系统与云计算:实现高效的资源分配和管理

    操作系统和云计算都是现代计算机科学的核心领域。操作系统负责管理计算机资源,为应用程序提供服务,而云计算则是利用大规模网络计算资源为用户提供服务。在这篇文章中,我们将探讨操作系统与云计算之间的密切关系,以及如何实现高效的资源分配和管理。 操作系统

    2024年04月11日
    浏览(43)
  • 医疗器械外贸ERP软件:优化资源分配,提升企业竞争力

    随着医疗器械外贸业务的不断发展,外贸业务管理ERP软件已经成为了医疗器械企业必不可少的一项工具。该软件解决方案可以有效地帮助企业管理海外市场、跟进海外订单、协调供应链等关键业务。 医疗器械外贸行业管理难点: 1、法规和标准: 涉及到不同国家和地区的法规

    2024年02月13日
    浏览(49)
  • 云计算中的负载均衡技术,确保资源的平衡分配

    🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:云计算 ✨文章内容:负载均衡技术 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 在云计算中,负载均衡是一种关键的技术,用于将网络

    2024年02月10日
    浏览(62)
  • Spark内存资源分配——spark.executor.memory等参数的设置方法

    基于论坛上一些关于spark内存设置的文章,我对一个项目中实际运行的任务进行了内存参数分析和优化。如果要了解更多详细设置原理,可见文末的参考文章链接。 已知内存分配存在通过用户提交的参数设置进行静态分配,和yarn进行动态分配两种,所以本文对两种状况都根据

    2023年04月13日
    浏览(113)
  • kubernetes(k8s)为容器和 Pod 分配内存资源

    展示如何将内存请求(request)和内存限制(limit)分配给一个容器。 我们保障容器拥有它请求数量的内存,但不允许使用超过限制数量的内存。 创建新的命名空间 编辑yaml文件 配置文件的 args 部分提供了容器启动时的参数。 “–vm-bytes”, “150M” 参数告知容器尝试分配 15

    2024年02月15日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包