【Linux】线程控制(二)

【Linux】线程控制(二)

文章目录

背景

Linux中没有真正的线程概念,而是复用进程数据结构和管理算法,用进程模拟线程

只有轻量级进程,不会提供线程的调用接口,而是提供轻量级进程的系统调用接口

但是我们用户需要线程调用,所以有pthread库帮我们封装了轻量级进程调用接口,我们可以直接使用线程接口

  • 每个linux平台自带pthread库,
  • 编写多线程代码需要pthread库

线程接口

在这里插入图片描述


每个线程都有自己的ID,
⭐pthread_create不是系统调用,需链接 -pthread

🚩进程控制

快速使用一下

#include<iostream>#include<pthread.h>#include<unistd.h> using namespace std;void*threadRoutine(void*args){constchar* str=(constchar*)args; cout<<str<<endl;int cnt=5;while(cnt--){ cout<<"thread id :"<<pthread_self()<<endl;sleep(1);}}intmain(){pthread_t tid; cout<<tid<<endl;pthread_create(&tid,nullptr,*threadRoutine,(void*)"thread 1"); cout<<tid<<endl;pthread_join(tid,nullptr);return0;}
在这里插入图片描述

刚开始tid没有初始化,主线程要最后一个退出,等待子线程

线程等待默认是阻塞的,为什么不考虑异常呢?
因为单个线程如果异常,整个进程都崩溃了

int g_val=100;void*threadRoutine(void* args){constchar* str=(constchar*)args;int cnt=5;while(cnt--){printf("%s pid: %d, g_val: %d, &g_val: 0x%p \n",str,getpid(),g_val,&g_val);sleep(1); g_val++;}//pthread_exit(100) //exit(100); //不能用exit,直接把整个进程退出了return(void*)100;//退出线程}intmain(){pthread_t tid;pthread_create(&tid,nullptr,*threadRoutine,(void*)"thread 1");int cnt=5;while(cnt--){printf("main thread %d, g_val: %d, &g_val: 0x%p , create a new thread: %p \n",getpid(),g_val,&g_val, tid);sleep(1); g_val++;}sleep(2);void* set;pthread_join(tid,&set); cout<<"new thread quit success"<<(longlongint)set<<endl;return0;}
ps -aL查看所有线程
while :; do ps -aL; sleep 1;done;监控
在这里插入图片描述


可以看到两个mythread,进程pid相同,LWP(light weight process轻量化进程)不同

  • LWP在内核看来就是线程

线程ID有两种:一种是内核视角LWP,另一种线程视角pthread_t

在这里插入图片描述


两个不同的执行流,共享相同的全局变量,也可以调用相同的函数,这里发生数据冲突了,后面会讲

所以,用户级线程(线程库控制)加上内核LWP才构成Linux线程,Linux也有内核级线程
用户级执行流:LWP=1:1

在这里插入图片描述

线程计算1-100

class Reques t { public:Request(int begin,int end,const string& threadname):_begin(begin),_end(end),_threadname(threadname){} public:int _begin;int _end; string _threadname;}; class Reponse { public:Reponse(int result,int exitcode):_result(result),_exitcode(exitcode){} public:int _result;//计算结果int _exitcode;//计算结果是否可靠};void*sumRoutine(void* args)// 线程的参数和返回值,不仅仅可以传递一般参数,还可以传递自定义对象{ Request* rq=static_cast<Request*>(args);//(Request*)args; Reponse* rsp=new Reponse(0,0);if(rq->_begin>rq->_end){ rsp->_exitcode=-1;}else{for(int i=rq->_begin;i<=rq->_end;i++){ rsp->_result+=i;}} delete rq;return rsp;}intmain(){pthread_t tid; Request *rq=new Request(1,100,"thread 1");pthread_create(&tid,nullptr,*sumRoutine,rq);void* set;pthread_join(tid,&set); Reponse *rsp=static_cast<Reponse*>(set); cout<<"rsp -> _result: "<<rsp->_result<<"rsp ->_exitcode: "<<rsp->_exitcode <<endl; delete rsp;return0;}
在这里插入图片描述

🚩线程库

线程的概念是库给我们维护的,线程库中有clone回调函数将执行流给进程PCB,共享父进程资源,线程库维护线程概念,不用维护执行流,线程库注定要维护多个线程属性集合,先描述再组织

线程库要不要加载到内存?
要,加载到共享区,等于动态库

在这里插入图片描述
在这里插入图片描述

c++11多线程

C++11也支持多线程了,已经帮我们封装好了,直接用就行

voidthreadrun(){while(true){ cout <<"I am a new thead for C++"<< endl;sleep(1);}}intmain(){ thread t1(threadrun); t1.join();return0;}

Read more

【Linux】网络基础(一)

【Linux】网络基础(一)

文章目录 * 网络发展 * 认识协议 * 🚩网络协议 * 🚩协议分层 * OSI七层协议 * 🚩TCP/IP五层(四层)协议 * 🚩网络传输基本流程 * 🚩数据包的封装和解包 * MAC地址 网络发展 起初计算机是用在军事上的 独立模式: 计算机之间相互独立 网络互联:多台计算机连接在一起实现网络互联 局域网LAN:计算机数量越来越多了,通过交换机和路由器连接在一起 广域网WAN:将远隔千里之外的的计算机连接在一起 所谓局域网广域网是相对概念,我们家庭路由器就可以看作局域网,把家家户户连接的社区就是广域网。社区看作局域网,把社区连接的就是广域网,中国网络看作局域网,连接世界就是广域网 认识协议 协议是一种约定 计算机之间通过光信号电信号交流,通过频率强弱来代表0和1,要想传递不同信息,就要约定好数据格式,比如000代表什么信息 要想多台计算机之间相互通信,就要约定共同的标准,这就是网络协议 🚩网络协议 🚩协议分层 打电话的例子,语言层汉语有协议,通信设备层也有协议 英语之间交流

By Ne0inhk
Flutter 组件 fluent_assertions 的适配 鸿蒙Harmony 实战 - 驾驭流式语义断言语法、实现鸿蒙端单元测试高可读性与复杂逻辑自证方案

Flutter 组件 fluent_assertions 的适配 鸿蒙Harmony 实战 - 驾驭流式语义断言语法、实现鸿蒙端单元测试高可读性与复杂逻辑自证方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 fluent_assertions 的适配 鸿蒙Harmony 实战 - 驾驭流式语义断言语法、实现鸿蒙端单元测试高可读性与复杂逻辑自证方案 前言 在鸿蒙(OpenHarmony)生态的大型分布式系统开发中,随着业务逻辑复杂度的指数级增长,原本简单的单元测试逐渐演变为由数百行冗长、枯燥且难以通过阅读理解其意图的 expect(result, isA<T>()) 堆砌而成的“代码仓库”。面对一个需要同时验证“返回值不为空 且 包含特定前缀 且 响应时间小于 50ms”的复合业务断言。如果仅仅依靠传统的 JUnit 风格写法。不仅会导致测试代码本身产生严重的维护债务,更会由于在测试失败时生成的机械化、无逻辑上下文的错误报文,引发开发者极其低效的排查过程。 我们需要一种“自然语言化、逻辑链式”的测试审计艺术。 fluent_

By Ne0inhk
鸿蒙金融理财全栈项目——运维监控、性能优化、安全加固

鸿蒙金融理财全栈项目——运维监控、性能优化、安全加固

《鸿蒙APP开发从入门到精通》第20篇:鸿蒙金融理财全栈项目——运维监控、性能优化、安全加固 📊🔧🛡️ 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第20篇——运维监控、性能优化、安全加固篇,100%承接第19篇的生态合作、用户运营、数据变现架构,并基于金融场景的运维监控、性能优化、安全加固要求,设计并实现鸿蒙金融理财全栈项目的运维监控、性能优化、安全加固功能。 学习目标: * 掌握鸿蒙金融理财项目的运维监控设计与实现; * 实现应用监控、服务器监控、数据库监控; * 理解性能优化在金融场景的核心设计与实现; * 实现前端优化、后端优化、数据库优化; * 掌握安全加固在金融场景的设计与实现; * 实现代码加固、数据加密、安全审计; * 优化金融理财项目的用户体验(运维监控、性能优化、安全加固)。 学习重点: * 鸿蒙金融理财项目的运维监控设计原则; * 性能优化在金融场景的应用; * 安全加固在金融场景的设计要点。 一、 运维监控基础 🎯 1.1 运维监控定义 运维监控是指对金融理财项目的应用、

By Ne0inhk
Flutter 组件 jaspr_serverpod 适配鸿蒙 HarmonyOS 实战:前后端同构,构建全栈式组件渲染与高性能后端集成架构

Flutter 组件 jaspr_serverpod 适配鸿蒙 HarmonyOS 实战:前后端同构,构建全栈式组件渲染与高性能后端集成架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 jaspr_serverpod 适配鸿蒙 HarmonyOS 实战:前后端同构,构建全栈式组件渲染与高性能后端集成架构 前言 在鸿蒙(OpenHarmony)生态迈向全栈式开发、涉及跨端组件复用及高性能服务端逻辑集成的背景下,如何实现前端 UI 组件与后端业务逻辑的“无缝类型对齐”,已成为提升全栈研发效率与系统稳定性的关键议题。在鸿蒙设备这类强调分布式架构与端云协同的环境下,如果前端应用(Jaspr)与后端引擎(Serverpod)依然依赖碎片的 REST 协议驱动,由于由于接口契约的离散性,极易由于由于“前后端模型失致”导致线上环境的数据解析崩溃或并发冲突。 我们需要一种能够支持全栈 Dart 编写、具备自动代码生成且支持服务器端渲染(SSR)的同构映射方案。 jaspr_serverpod 为 Flutter/Dart 开发者引入了“全栈闭环”开发模式。

By Ne0inhk