【Linux】信号(二):Linux原生线程库相关接口

【Linux】信号的控制使用

  • 一.线程的创建
    • pthread_create()接口
  • 二.线程等待
    • 1.为什么要线程等待?
    • 2.pthread_join()
  • 三.线程中止
    • 1.return
    • 2.pthread_exit
  • 五.线程应用
    • C++自带多线程

在上次的博客中主要讲解了什么是线程
这次的博客主要是带大家把线程的相关接口简单的使用一下

这次博客的篇幅不长,就单纯了解接口的,之后的博客才会来主要剖析线程

首先在Linux中有一个原生线程库
Linux中没有线程的概念,但是用户肯定是需要线程这个东西的

所以说Linux中有一个原生线程库(基本上所有的Linux中都有)
叫做pthread.h,正是这个原生线程库给用户提供了Linux中的线程的这个概念

这个博客接下来就是带大家来认识一下比较常用的原生线程库中的接口的

一.线程的创建

pthread_create()接口

在这里插入图片描述

这里带大家来认识一下对应的参数

在这里插入图片描述

大致就是这么个用处

#include<iostream>
#include<pthread.h>
#include<unistd.h>
void* run_pthread(void* argv)
{std::cout<<*(int*)argv<<std::endl;
}int main()
{pthread_t lwp_id;int i=10;pthread_create(&lwp_id,nullptr,run_pthread,(void*)&i);sleep(5);}

这边随便写一个用用

在这里插入图片描述

这里可能有人注意到,为什么要sleep(5)

众所周知,主线程和子线程是同时运行的,创建完子线程,这个主线程就直接结束了
所以说这个int i的变量直接就在主线程中被销毁了

所以说接下来就引出了线程等待

二.线程等待

1.为什么要线程等待?

首先什么是线程等待?

我们在什么地方看到过等待?

就是我们以前在进程博客中写过的,进程等待

还记得为什么父子进程要等待吗
因为你父进程把子进程生了下来,你不能不管啊
如果你父进程结束了,子进程没有人来回收,那就变成孤儿进程和僵尸进程

映射到我们线程,其实原理也差不多
但是还是有一点不一样的。
进程是独立的,但是线程是进程的执行流
当主线程结束后(也就是main函数结束),所有的子进程也会中断
那为什么要等待呢?
1.资源回收
线程退出时,其栈内存和系统资源不会自动释放,需要等待来正确释放

2.同步执行顺序:
确保某些操作在其他线程完成后执行

3.获取返回值:
就是进程执行的结果

所以说我们要介绍一个线程等待的接口
可以接受线程执行结果的返回值,而且是阻塞等待

2.pthread_join()

在这里插入图片描述
在这里插入图片描述
接口大致就是这样的思路

#include<iostream>
#include<pthread.h>
#include<unistd.h>
void* run_pthread(void* argv)
{std::cout<<*(int*)argv<<std::endl;
}int main()
{pthread_t lwp_id;int i=10;pthread_create(&lwp_id,nullptr,run_pthread,(void*)&i);pthread_join(lwp_id,nullptr);
}

在这里插入图片描述

这里我们把sleep,直接换成了 pthread_join(lwp_id,nullptr);
因为是阻塞等待,只会等待子线程处理完,才会结束,所以i的生命周期还在,没有被销毁

在这里插入图片描述
这里其实一直有个编译警告,这里没有放出来

意思就是子线程没有返回值
这里就带大家把这个等待线程的接受子线程返回值给用用

#include<iostream>
#include<pthread.h>
#include<unistd.h>
void* run_pthread(void* argv)
{std::cout<<*(int*)argv<<std::endl;return (void*)(intptr_t)1;
}int main()
{pthread_t lwp_id;int i=10;pthread_create(&lwp_id,nullptr,run_pthread,(void*)&i);void* ret;pthread_join(lwp_id,&ret);std::cout<<"running end= "<<(intptr_t)ret<<std::endl;
}

在这里插入图片描述
这个intptr_t是C++库中的一个整数类型,它专门用于安全地存储指针值
intptr_t 是一个有符号整数类型,其大小能够容纳任何有效的指针值

子线程执行结果是通过void*来返回的
所以说我们在子进程中返回void*

然后在pthread_join中接受的返回值是void()**

二级指针就是接受一级指针的地址的所以用取地址

这里要注意一点:
为什么在pthread_join中不考虑异常,只考虑返回值

因为线程出现异常问题,整个线程都完了,所以只有进程才会去考虑异常

三.线程中止

这个其实就是如何返回进程的返回值的

1.return

这个我们在上面的代码中使用过了,接下来就随便用用下一个

2.pthread_exit

在这里插入图片描述
这个其实就当return用就行

#include<iostream>
#include<pthread.h>
#include<unistd.h>
void* run_pthread(void* argv)
{std::cout<<*(int*)argv<<std::endl;pthread_exit((void*)(intptr_t)1);
}int main()
{pthread_t lwp_id;int i=10;pthread_create(&lwp_id,nullptr,run_pthread,(void*)&i);void* ret;pthread_join(lwp_id,&ret);std::cout<<"running end= "<<(intptr_t)ret<<std::endl;
}

在这里插入图片描述

五.线程应用

C++自带多线程

c++11也已经支持多线程


#include<iostream>
#include<thread>void run_code()
{std::cout<<"i am ok"<<std::endl;}int main()
{std::thread t(run_code);t.join();return 0;}

在这里插入图片描述

但其实在Linux中的C++的多线程也是封装的,底层用的还是pthread的原生线程库
因为你编译的时候,还是需要-lpthread链接原生线程库
在这里插入图片描述

不管是什么语言,底层都是调用的原生线程库,进行封装的
推荐使用语言自带的,因为具有可移植性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94175.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序被爬虫攻击,使用waf能防护吗?

在移动互联网时代&#xff0c;小程序以轻量化、高便捷性成为流量入口新宠&#xff0c;但也因此成为爬虫攻击的重灾区。从电商平台的价格数据爬取到内容平台的版权盗用&#xff0c;爬虫攻击不仅消耗服务器资源&#xff0c;更可能导致商业机密泄露与用户权益受损。面对这类威胁&a…

通过自动化本地计算磁盘与块存储卷加密保护数据安全

作为打造开发者首选云平台使命的一部分&#xff0c;我们持续推出免费的智能化功能与产品来加强云资源安全。最新推出的本地磁盘加密功能是我们正在所有核心计算区域逐步部署的最新计算特性。当您在首选区域启用本地磁盘加密功能后&#xff0c;新部署的计算实例将默认自动启用数…

中文房间悖论:人工智能理解力的哲学拷问

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01;1 思想实验阐述中文房间&#xff08;Chinese Room&#xff09;思想实验…

mac如何运行windows程序?性能党vs便捷党选择指南

macOS的流畅稳定虽让人青睐&#xff0c;但系统的不兼容性是个大问题。有的用户想要使用某个专业程序&#xff0c;发现只有Windows版本&#xff0c;然而没法直接在mac上运行&#xff0c;非常懊恼&#xff01;mac如何运行windows程序&#xff1f;本文将提供多个可行的方法&#x…

设置电机数据(闭环驱动器C5-E) ——易格斯igus

4.3 设置电机数据 在调试之前&#xff0c;电机控制器需要电机数据表中的一些值。 ■ 极对数&#xff1a;对象 2030h&#xff1a;00h&#xff08;极对数&#xff09; 电机极对数应在此处输入。对于步进电机&#xff0c;极对数使用步距角计算&#xff0c;例如&#xff0c;1.8 …

药品追溯码(溯源码)采集系统(二):门诊发药后端

门诊发退药追溯码采集系统解析&#xff1a;一、门诊发退药追溯码数据表1.1、Wm_ware_dispense_bill表&#xff1a;该表用于存储处方信息1.2 Wm_ware_dispense_tracecode:追溯码采集表二、发退药后端代码后端代码基于Springboot架构和mybatis-plus&#xff0c;先看主要接口信息&…

Unity编辑器相关

前言继承EditorWindow。 GUILayout类与EditorGUILayout类的应用区别&#xff1a;//TODO创建窗口的方法1&#xff09;GetWindow<T>() 已开则聚焦、未开则创建。无需再手动调用 Show()。GetWindow<T>() 提供多个重载。2&#xff09;CreateInstance<T>()始终创建…

ES支持哪些数据类型,和MySQL之间的映射关系是怎么样的?

Elasticsearch&#xff08;简称 ES&#xff09;是一个分布式搜索和分析引擎&#xff0c;支持丰富的数据类型来适应不同场景。MySQL 是一个关系型数据库&#xff0c;两者在数据类型上存在差异&#xff0c;但可以通过映射实现数据同步或集成。下面我将逐步解释 ES 支持的数据类型…

8.21IPSEC安全基础后篇,IKE工作过程

一、数据存储完整性校验数据存储完整性校验需通过加密密钥实现。数据存储前还需通过身份认证&#xff0c;该过程同样依赖密钥完成。二、对称key的产生、传递、管理VPN中需使用多组对称密钥&#xff1a;数据加解密需独立密钥数据完整性校验需独立密钥身份认证需独立密钥不同功能…

网络连接的核心机制

一、网络连接全流程拆解&#xff08;含7大步骤动态交互&#xff09; 1. 用户输入网址&#xff1a;从域名到IP的跨越 操作触发&#xff1a;用户在浏览器输入 www.example.com&#xff0c;触发 DNS域名解析。核心协议&#xff1a;DNS&#xff08;基于UDP/TCP&#xff09;。硬件设…

小程序个人信息安全检测技术:从监管视角看加密与传输合规

1. 前言 在监管通报中&#xff0c;小程序因“未采取加密、去标识化等安全技术措施”被处罚的案例屡见不鲜。很多开发者疑惑&#xff1a;明明用了HTTPS&#xff0c;为什么还会被判定“未加密”&#xff1f;监管机构是如何通过技术手段发现这些问题的&#xff1f;本文将从技术原…

ansible playbook 实战案例roles | 实现db2自动安装

文章目录一、核心功能描述二、roles内容2.1 文件结构2.2 主配置文件2.3 tasks文件内容三、files文件内容四、vars文件内容免费个人运维知识库&#xff0c;欢迎您的订阅&#xff1a;literator_ray.flowus.cn 一、核心功能描述 这个 Ansible Role 的核心功能是&#xff1a;​自动…

webrtc中win端音频---windows Core Audio

一、Core Audio 系统内核框架 图中显示的是渲染的音频数据如何从大多数应用程序流向扬声器的简化表示。对于采集来说,音频数据的路径是完全相同,但流向是相反的。从图中可以看到,一些高阶API(例如MME,DirectSound等),对 Core Audio APIs 进行了封装,使用这些API能够更容…

【数据可视化-96】使用 Pyecharts 绘制主题河流图(ThemeRiver):步骤与数据组织形式

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

【Android】Activity 如何进行数据传输

三三要成为安卓糕手 一&#xff1a;Activity之间的数据传输 问题&#xff1a;不同的Activity之间怎么进行数据传输呢? 比如第一个页面中有一些字符串数据之类的要通过数据传输&#xff0c;传递给第二个页面进行显示的 1&#xff1a;MainActivity做处理 在定义一个按钮&#xf…

C#语言的语法(数据类型)

数据类型 表2.1给出了C#的主要数据类型。注意&#xff0c;基本类型的长度与计算机或操作系统的类型无关。C# 中的字符是16位的宽度&#xff0c;可以表示非拉丁语言中的所有字符。它使用一种叫双字节码的字符编码 系统&#xff0c;其中定义了绝大多数可书写语言的数以千计的字符…

Vue3 + TypeScript全局阻止非输入区域的Backspace键,防止回退页面

main.ts/*** 应用程序主入口** 初始化 Vue 应用并挂载到 DOM*/ import "./assets/style/main.scss";import { createApp } from "vue"; // 全局引入element-plus&#xff0c;对打包后的文件大小不是很在乎&#xff0c;那么使用全局导入会更方便 import Ele…

01数据结构-堆排序

01数据结构-堆排序前言1.堆2.堆的操作逻辑3.堆的代码实现前言 数据结构中的堆是一种结构&#xff0c;C语言的堆是空间管理的程序员malloc&#xff0c;free的空间&#xff0c;两者没多大关系。 1.堆 逻辑上 堆&#xff08;Heap&#xff09;是一类基于完全二叉树的特殊数据结构…

在线课程|基于SprinBoot+vue的在线课程管理系统(源码+数据库+文档)

在线课程 目录 基于SprinBootvue的在线课程管理系统 一、前言 二、系统设计 三、系统功能设计 1 管理员模块的实现 2在线课程 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|…

Python海象运算符:=

文章目录简介​​条件判断优化循环控制简化​推导式高效计算​正则匹配与数据提取​性能对比参考文献简介 海象运算符 :&#xff0c;又称​​赋值表达式​​&#xff08;Assignment Expression&#xff09;&#xff0c;Python 3.8 后可用&#xff0c;PEP 572 引入&#xff0c;…