当前位置: 首页 > news >正文

【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.dtcms.com/a/339388.html

相关文章:

  • C#多线程学习—主子线程,Invoke与begininvoke
  • RabbitMQ:SpringBoot+RabbitMQ入门案例
  • 《用Proxy解构前端壁垒:跨框架状态共享库的从零到优之路》
  • vue3使用RouterLink跳转的时候,路径正确但是不显示对应内容
  • Computer Using Agents:数字世界中的超级用户——架构设计与产业实践
  • RNN深层困境:残差无效,Transformer为何能深层?
  • Qt猜数字游戏项目开发教程 - 从零开始构建趣味小游戏
  • 【数据库】通过‌phpMyAdmin‌管理Mysql数据
  • 概率论基础教程第5章 连续型随机变量(二)
  • 字节开源了一款具备长期记忆能力的多模态智能体:M3-Agent
  • RabbitMQ:SpringBoot+RabbitMQ Direct Exchange(直连型交换机)
  • 第7章 React性能优化核心
  • [langgraph]创建第一个agent
  • 如何在 Git Commit Message 中正确提及共同贡献者(Co-authored-by 实践指南)
  • 图解快速排序C语言实现
  • 数据结构----八大排序算法
  • 【报文构造】构造一个异常的IPV6报文,测试设备可靠性
  • 集成电路学习:什么是Object Tracking目标跟踪
  • 浙江电信IPTV天邑TY1613_高安版_晶晨S905L3SB_安卓9_原厂固件自改_线刷包
  • Arthas 全面使用指南:离线安装 + Docker/K8s 集成 + 集中管理
  • WRC大会精彩回顾 | NanoLoong机器人足球首秀青龙机械臂咖啡服务双线出击
  • 释永信,领先10年的AI心法!
  • sqllabs(2)
  • 机器学习之数据模型训练(三)
  • 嵌入式第三十二天(信号,共享内存)
  • 装修水电全改的避坑指南有哪些?
  • [激光原理与应用-304]:光学设计 - 光学设计报告的主要内容、格式与示例:系统记录了从需求分析到最终设计的完整过程
  • windows环境,安装kafka
  • PMP项目管理:PMBOK 第六版 与 第七版 有啥区别 / 如何备考
  • Spring Boot应用实现图片资源服务