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

linux---线程控制


线程和进程

以前我们要同时跑多个程序,可以通过fork()多个子进程,然后通过系统函数进行程序的替换,但是创建进程代价大,不仅要拷贝一份父进程的地址空间,页表,文件表述符表等。但是线程不需要因为是进程的执行流,共享同个地址空间,页表,只需让不同线程执行不同的代码块(函数就可以了)。

一、线程函数接口

它们的返回值都比较统一,成功就返回0,失败就返回错误码

(1)线程创建

第一个参数类型是我们在定义的一个pthread_t类型的变量指针,通过它我们可以拿到 用户识别的线程id。第二个参数设置为空。第三个参数是函数指针,第四个是我们要传入线程执行函数的参数,由于它的类型是void*,我们可以传入任意类型

(2)线程等待 

线程和进程一样,虽然是一个进程的地址空间的执行流,但是也要进行等待回收,不然会造成类似内存泄漏 问题。retval是输出型参数,通过它可以拿到线程退出信息(简单说就是线程执行函数的返回值)。

(3)线程中止

 进程有退出码,线程没有,只有我们自己写的返回值,既用pthread_exit()返回,或者直接return返回自定义的码(由于返回值类型是void*,要强转),不建议用exit()因为会造成主线程退出,主线程退出了,进程资源就释放了,所有线程就跟着退出了。通常这返回值信息会被线程等待函数pthread_join()拿到。


(4)线程分离 

 以前子进程退出如果父进程不进行等待,我们可以自定义捕捉函数对子进程发出的退出信号进行忽略,不会有僵尸进程。线程也可以通过分离,让主线程不用主动对它进行等待,就算线程退出也不会有类型内存泄漏问题。注意的是,线程分离只是一种工作状态,它和没分离的线程几乎一样,只是不用等待了。

二,多线程的创建

pthread_create函数参数由于是void*,我们就可以传任意类型的对象

makefile

test:classpthreads.ccg++ -o  $@ $^ -std=c++11 -lpthread 
.PHONY:clean
clean:rm -f test

 classpthreads.cc

#include<iostream>
using namespace std;
#include<pthread.h>
#include<unistd.h>
#include<string.h>
#include <sys/types.h>
#include<vector>namespace ljh{
class Task{
public:
Task():datex(0),datey(0)
{}
void SetDate(int x,int y)
{datex=x;datey=y;
}
int Excute()
{return datex+datey;
}
~Task()
{}private:int datex;int datey;};
class threaddate:public Task
{
public:threaddate(int x,int y,char* threadname ):_x(x),_y(y),_threadname(threadname){s.SetDate(_x,_y);}string getname(){return _threadname;}int run(){s.Excute();}private:
string _threadname;
int _x;
int _y;
Task s;};
class Result{
public:
void SetResult(int result,string& threadname)
{_result=result;_threadname=threadname;}
void Print()
{cout<<"result:"<<_result<<"threadname"<<_threadname<<endl;}
private:int _result;string _threadname;
};}using namespace ljh;
void* handlerTask(void*p)
{threaddate* td=static_cast<threaddate*>(p);
string name=td->getname();
Result* result=new Result();
int ret=td->run();
result->SetResult(ret,name);
delete td;
sleep(2);
return result;}vector<Result*>  ret;
vector<pthread_t> pthreadname;
int main()
{for(int i=0;i<5;i++)//创建5个线程{char* name=new char[64];pthread_t id;snprintf(name,sizeof(name),"Thread_%d",i+1);threaddate* p=new threaddate(2,6,name);pthread_create(&id,nullptr,handlerTask,p);pthreadname.push_back(id);}for(auto e:pthreadname){  void* s=nullptr;//返回值,void*pthread_join(e,&s);//线程等待回收ret.push_back((Result*)s);}return 0;
}

三.创建的线程和主线程之间关系

1.多线程只是主线程的执行流,主线程main退出,子进程也会退出,所以我们必须让主线程最后退出

2.创建的新线程和主线程,哪个先运行,这个取决与调度器。

线程共享和私有

(1)共享:代码和全局数据和进程文件描述符表

因为它们拥有同一块地址空间

(2)私有:线程的硬件上下文数据(cpu寄存器的值),线程的独立栈结构。对于多进程来说,线程的上下文数据比进程少,所以也叫线程为轻量级进程。

我们可以用命令查看(ps -aL | grep  xxx).对于栈来说,不同线程可以分为进程地址空间的栈空间还有线程独立的栈,访问全局数据就时访问进程地址空间主栈,在线程执行函数里面变量之类的就是线程独立的栈。

验证:创建3个线程,定义一个全局变量vale,还有线程执行函数的n,不同的线程打印全局vale地址是相同,n的地址却是不同的。

相关文章:

linux---线程控制

线程和进程 以前我们要同时跑多个程序&#xff0c;可以通过fork()多个子进程&#xff0c;然后通过系统函数进行程序的替换&#xff0c;但是创建进程代价大&#xff0c;不仅要拷贝一份父进程的地址空间&#xff0c;页表&#xff0c;文件表述符表等。但是线程不需要因为是进程的…...

低代码开发:拖拽式可视化构建工业物联网系统

什么是低代码&#xff1f; 低代码(Low Code)是一种可视化的软件开发方法&#xff0c;通过最少的手动编码可以更快地交付应用程序。低代码平台的图形用户界面和拖放功能可自动执行开发过程的各个方面&#xff0c;从而消除对传统计算机编程方法的依赖。 什么是低代码平台&#…...

【撸源码】【ThreadPoolExecutor】线程池的工作原理深度解析——上篇

1. 前言 线程池这块&#xff0c;作为高频面试题&#xff0c;并且实际使用场景巨多&#xff0c;所以出了这篇文章&#xff0c;一块来研究一下线程池的实现原理&#xff0c;运行机制&#xff0c;从底层深挖&#xff0c;不再局限于面试题。 2. 线程池概览 2.1. 构造器 线程池总…...

webpack 学习之 五大核心

为什么用 webpack webpack 官网传送门 … 官网&#xff1a;webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。将你项目中所需的每一个模块组合成一个或多个 bundles&#xff0c;它们均为静态资源&#xff0c;用于展示你的内容。总结&#xff1a;汇总所有模块…...

Android逆向抓包技巧 - Hook 底层通信

一,请求的本质 平时开发使用的 http 或 https 均属于应用层的协议,其本质都会调用 TCP 发送请求。 例如:你在 Python 中使用 requests 模块发送一个 http 请求,其底层就是使用 socket 模块 + TCP 实现发送的请求。 import requestsres = requests.get("http://wiki…...

深入解析力扣162题:寻找峰值(线性扫描与二分查找详解)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…...

模板方法及设计模式——Java笔记

模板方法及设计模式 抽象类体现的就是一种模板模式的设计&#xff0c;抽象类作为多个子类的通用模板&#xff0c;子类在抽象类的基础上进行扩展、改造&#xff0c;但子类总体上会保留抽象类的行为方式。 解决的问题&#xff1a; 当功能内部一部分实现是确定的&#xff0c;另一…...

K8S认证|CKA题库+答案| 11. 创建PVC

11、创建PVC 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node ok8s master …...

多微信如何高效管理?一台电脑就能搞定!

对于有多个微信号的人来说&#xff0c;管理这些微信无疑是一道难题。 今天&#xff0c;就给大家分享一个能够让你高效管理多个微信号的神器——个微管理系统&#xff0c;下面&#xff0c;就一起来看看它都有哪些功能吧&#xff01; 1、多号同时登录在线 系统支持多个微信号同…...

安装harbor出现问题: Running 1/1 ✘ Network harbor_harbor Error

安装harbor出现问题&#xff1a; [] Running 1/1 ✘ Network harbor_harbor Error 0.2s failed to create network harbor_harbor: Error response from daemon: Fa…...

JVM解释器和即时编译器的工作原理

1、解释器&#xff1a; 当Java程序启动时&#xff0c;JVM的解释器首先读取Java字节码&#xff08;通常存在于.class文件中&#xff09;。 解释器将字节码解析为相应的指令&#xff0c;每条指令对应JVM中的一个操作。 解释器根据指令的类型和操作数&#xff0c;执行相应的计算或…...

【产品经理】输出

引言&#xff1a;        在最近频繁的产品管理职位面试中&#xff0c;我深刻体会到了作为产品经理需要的不仅仅是对市场和技术的敏锐洞察&#xff0c;更多的是在复杂多变的环境中&#xff0c;如何运用沟通、领导力和决策能力来引导产品从概念走向市场。这一系列博客将分享…...

MySQL入门学习.数据库组成.存储引擎

存储引擎是 MySQL 数据库的一个重要组成部分&#xff0c;它决定了数据的存储方式、索引方式、事务支持等特性。MySQL 支持多种存储引擎&#xff0c;常见的有 InnoDB、MyISAM、Memory 等。 存储引擎的特点和使用方法&#xff1a; 1. InnoDB&#xff1a; 是 MySQL 默认的存储引…...

【算法】分治 - 快速排序

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、颜色分类二、排序数组三、数组中的第k个数四、最小的k个数总结 引言 本节主要介绍快速排序&#xf…...

设计模式13——桥接模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 桥接模式&#xff08;Bridge&a…...

第十六讲:数据在内存中的存储

第十六讲&#xff1a;数据在内存中的存储 1.整数在内存中的存储1.1存储方式1.2大小端字节序1.3大小端字节序排序规则1.4为什么要有大小端1.5练习1.5.1练习11.5.2练习21.5.3练习31.5.4练习41.5.5练习51.5.6练习61.5.7练习7 2.浮点数在内存中的存储2.1练习2.2浮点数的存储2.3浮点…...

【EXCEL_VBA_基础知识】15 使用ADO操作外部数据

课程来源&#xff1a;王佩丰老师的《王佩丰学VBA视频教程》&#xff0c;如有侵权&#xff0c;请联系删除&#xff01; 目录 1. 使用ADO链接外部数据源 2. 常用SQL语句&#xff08;Execute(SQL语句)&#xff09; 2.1 查询数据、查询某几个字段、带条件查询、合并两表数据、插…...

如何在Spring中配置Bean?

在Spring框架中配置Bean&#xff0c;主要有以下几种方式&#xff1a; XML配置文件注解配置Java配置类 1. XML配置文件 早期的Spring版本广泛使用XML配置文件来定义和配置Bean。在XML中&#xff0c;可以通过 <bean> 标签定义Bean&#xff0c;指定其类、唯一标识符&…...

深入学习 torch.distributions

0. 引言 前几天分几篇博文精细地讲述了《von Mises-Fisher 分布》, 以及相应的 PyTorch 实现《von Mises-Fisher Distribution (代码解析)》, 其中以 Uniform 分布为例简要介绍了 torch.distributions 包的用法. 本以为已经可以了, 但这两天看到论文 The Power Spherical dist…...

Java中的判断校验非空问题

目录 字符串 字符串是空的情况 字符串不是空的情况 对象 对象是空的情况 对象不是空的情况 前端传的 int ,double类型等等 Optional 判断情况 https://www.cnblogs.com/zhangboyu/p/7580262.htmlhttps://www.cnblogs.com/zhangboyu/p/7580262.html 值为空的情况,不会…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

解析“道作为序位生成器”的核心原理

解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制&#xff0c;重点解析"道作为序位生成器"的核心原理与实现框架&#xff1a; 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...

React核心概念:State是什么?如何用useState管理组件自己的数据?

系列回顾&#xff1a; 在上一篇《React入门第一步》中&#xff0c;我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目&#xff0c;并修改了App.jsx组件&#xff0c;让页面显示出我们想要的文字。但是&#xff0c;那个页面是“死”的&#xff0c;它只是静态…...

HTTPS证书一年多少钱?

HTTPS证书作为保障网站数据传输安全的重要工具&#xff0c;成为众多网站运营者的必备选择。然而&#xff0c;面对市场上种类繁多的HTTPS证书&#xff0c;其一年费用究竟是多少&#xff0c;又受哪些因素影响呢&#xff1f; 首先&#xff0c;HTTPS证书通常在PinTrust这样的专业平…...

uniapp获取当前位置和经纬度信息

1.1. 获取当前位置和经纬度信息&#xff08;需要配置高的SDK&#xff09; 调用uni-app官方API中的uni.chooseLocation()&#xff0c;即打开地图选择位置。 <button click"getAddress">获取定位</button> const getAddress () > {uni.chooseLocatio…...

虚拟机网络不通的问题(这里以win10的问题为主,模式NAT)

当我们网关配置好了&#xff0c;DNS也配置好了&#xff0c;最后在虚拟机里还是无法访问百度的网址。 第一种情况&#xff1a; 我们先考虑一下&#xff0c;网关的IP是否和虚拟机编辑器里的IP一样不&#xff0c;如果不一样需要更改一下&#xff0c;因为我们访问百度需要从物理机…...