【c++】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗?
【c++】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗?
1.线程终止会导致进程终止吗?
在操作系统中,线程是进程的基本执行单元,一个进程可以包含一个或多个线程。
- 当一个子线程终止时,进程并不会因此自动终止,其他线程(包括主线程)仍然会继续运行。
- 当主线程都终止时,进程才会结束。
1子线程先结束,主线程继续执行,进程不会终止
1.1使用detach(): 将子线程与主线程分离
#include <iostream>
#include <thread>
#include <chrono>void worker() {std::cout << "子线程开始执行。" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟一些工作std::cout << "子线程结束。" << std::endl;
}int main() {std::cout << "主线程开始执行。" << std::endl;std::thread t(worker); // 创建子线程t.detach(); // 将子线程与主线程分离,主线程不等待子线程std::cout << "主线程继续执行,不等待子线程。" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(5)); // 主线程继续执行std::cout << "主线程结束。" << std::endl;return 0;
}
- List itemstd::thread t(worker): 这行代码创建了一个新的子线程,执行 worker 函数。
- t.detach(): 将子线程与主线程分离,使得主线程不会等待子线程完成。子线程将独立执行。
- std::this_thread::sleep_for(std::chrono::seconds(5)): 主线程继续执行,并且睡眠 5 秒,确保子线程有时间执行。
- 子线程在 2 秒后结束,主线程在 5 秒后结束。
运行结果:
- 主线程和子线程各自独立运行,互不干扰。
- 即使子线程先于主线程结束,主线程仍会继续执行,直到完成其自身的任务。
1.2不使用detach(): 将子线程与主线程分离
#include <iostream>
#include <thread>
#include <chrono>void worker() {std::cout << "子线程开始执行。" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟一些工作std::cout << "子线程结束。" << std::endl;
}int main() {std::cout << "主线程开始执行。" << std::endl;std::thread t(worker); // 创建子线程std::cout << "主线程继续执行,不等待子线程。" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(5)); // 主线程继续执行std::cout << "主线程结束。" << std::endl;return 0;
}
运行结果:
程序抛出了一个异常,但是异常没有被正确处理,但是主线程继续执行
1.3 使用 join(): 主线程等待子线程结束
#include <iostream>
#include <thread>
#include <chrono>void worker() {std::cout << "子线程开始执行。" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(5));std::cout << "子线程结束。" << std::endl;
}int main() {std::cout << "主线程开始执行。" << std::endl;std::thread t(worker); // 创建子线程// 使用 join() 确保主线程等待子线程完成t.join();std::cout << "主线程结束。" << std::endl;return 0;
}
运行结果:
主线程等待子线程结束,整个进程再结束
2主线程先结束,其他线程被迫终止,进程也终止
#include <iostream>
#include <thread>
#include <chrono>void worker() {std::cout << "子线程开始执行。" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(10)); // 模拟一些工作std::cout << "子线程结束。" << std::endl;
}int main() {std::cout << "主线程开始执行。" << std::endl;std::thread t(worker); // 创建子线程std::this_thread::sleep_for(std::chrono::seconds(2)); // 主线程继续执行std::cout << "主线程结束。" << std::endl;return 0;
}
- 主线程先于子线程结束,子线程被迫中止,进程也结束了
2.线程崩溃会导致进程崩溃吗?
- 子线程崩溃不一定会导致进程崩溃,关键在于如何处理子线程中的错误和异常。
2.1子线程崩溃导致进程崩溃的情况
2.1.1子线程访问非法内存(进程崩溃)
(1)
#include <iostream>
#include <pthread.h>void* thread_func(void* arg) {// 模拟非法内存访问int* ptr = nullptr;*ptr = 42; // 触发崩溃return nullptr;
}int main() {pthread_t thread;// 创建子线程if (pthread_create(&thread, nullptr, thread_func, nullptr) != 0) {std::cerr << "Failed to create thread." << std::endl;return 1;}pthread_join(thread, nullptr); // 等待子线程结束std::cout << "Main thread continues running." << std::endl;return 0;
}
执行结果:
子线程访问了一个空指针,导致了段错误(Segmentation fault),进程崩溃。
(2)
#include <iostream>
#include <thread>
#include <string>void thread_func(char* str) {// 尝试修改只读字符串str[0] = 'X'; // 修改字符串的第一个字符std::cout << "Thread modified string: " << str << std::endl;
}int main() {char * str = "Hello, World!"; // 常量字符串(只读数据)// 创建多个线程来修改该字符串std::thread t1(thread_func, std::ref(str));std::thread t2(thread_func, std::ref(str));t1.join();t2.join();return 0;
}
执行结果:
子线程访问了无法被修改的常量区数据,导致了段错误(Segmentation fault),进程崩溃。
2.1.2 子线程抛出未捕获的异常(进程崩溃)
如果子线程抛出未捕获的异常,默认情况下会导致调用 std::terminate,从而导致进程崩溃。
#include <iostream>
#include <pthread.h>
#include <stdexcept>void* thread_func(void* arg) {// 模拟子线程中的异常throw std::runtime_error("Child thread crashed!");return nullptr;
}int main() {pthread_t thread;// 创建子线程if (pthread_create(&thread, nullptr, thread_func, nullptr) != 0) {std::cerr << "Failed to create thread." << std::endl;return 1;}pthread_join(thread, nullptr); // 等待子线程结束std::cout << "Main thread continues running." << std::endl;return 0;
}
执行结果:
- 子线程崩溃而没有适当的处理,std::terminate 会导致进程崩溃。
- 子线程未捕获异常而触发了 std::terminate,导致整个进程崩溃,而不仅仅是子线程。
这是因为,在多线程程序中,std::terminate 的行为会影响整个进程,即使子线程崩溃,主线程仍然会被中断并导致进程崩溃。
2.2子线程崩溃,但进程继续运行(捕获异常或通过错误处理)
2.2.1子线程异常被捕获,进程不崩溃
#include <iostream>
#include <pthread.h>
#include <stdexcept>void* thread_func(void* arg) {try {// 模拟子线程中的异常throw std::runtime_error("Child thread crashed!");} catch (const std::exception& e) {std::cerr << "Caught exception in child thread: " << e.what() << std::endl;}return nullptr;
}int main() {pthread_t thread;// 创建子线程if (pthread_create(&thread, nullptr, thread_func, nullptr) != 0) {std::cerr << "Failed to create thread." << std::endl;return 1;}pthread_join(thread, nullptr); // 等待子线程结束std::cout << "Main thread continues running." << std::endl;return 0;
}
执行结果:
2.2.2 子线程崩溃(但是通过分离线程,主线程继续执行)
#include <iostream>
#include <pthread.h>
#include <stdexcept>void* thread_func(void* arg) {throw std::runtime_error("Child thread crashed!");return nullptr;
}int main() {pthread_t thread;// 创建子线程if (pthread_create(&thread, nullptr, thread_func, nullptr) != 0) {std::cerr << "Failed to create thread." << std::endl;return 1;}pthread_detach(thread); // 分离子线程,主线程继续执行std::cout << "Main thread continues running." << std::endl;return 0;
}
执行结果:
子线程抛出异常,但因为子线程已经分离,主线程不会被阻塞,进程继续运行,主线程完成执行。
总结
子线程崩溃导致进程崩溃的情况: 如果子线程因为非法内存访问(如空指针解引用)或者未捕获的异常(导致 std::terminate),则进程会崩溃。
子线程崩溃但不导致进程崩溃: 如果子线程抛出异常且异常被捕获,或者使用了 pthread_detach 来分离子线程,主线程仍然能够继续执行,进程不会崩溃。
相关文章:
【c++】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗?
【c】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗? 1.线程终止会导致进程终止吗? 在操作系统中,线程是进程的基本执行单元,一个进程可以包含一个或多个线程。 当一个子线程终止时,进程并不会因此自动终…...
Deepseek 怼CHATGPT实况
提示词: 用犀利的语言批评ChatGPT 深度思考(R1) 嗯,用户让我用犀利的语言批评ChatGPT。首先,我需要理解他们的动机。可能他们遇到了ChatGPT的某些问题,比如回答不准确或者缺乏深度,所以想表达不满。也有…...
内核数据结构用法(2)list
list 在 Linux 内核中,链表操作是通过一组宏和函数来实现的,这些操作通常用来管理和遍历链表。以下是一些常用的链表函数和宏的具体用法。 1. 定义链表节点 首先,你需要定义一个包含 struct list_head 的结构体: #include <…...
量化自学 - 金融理论与python - Net Present Value 净现值
净现值(Net Present Value,NPV)是金融理论中用于评估投资项目价值的指标。其核心思想是将未来现金流按一定贴现率折算为当前价值,并减去初始投资成本。若NPV为正,表明项目预期收益高于成本,具有投资价值&am…...
Java Web开发实战与项目——用户认证与授权模块开发
Web应用中,用户认证与授权是至关重要的功能,确保只有合法用户才能访问受保护的资源。Spring Security作为一个强大的安全框架,支持多种认证与授权方式。在本章节中,我们将深入探讨三种常见的用户认证与授权方案:基于To…...
蓝桥杯篇---IAP15F2K61S2中断
文章目录 前言简介中断源1.外部中断2.定时器中断3.串口中断4.ADC中断5.PCA中断6.SPI中断7.PWM中断 中断优先级中断相关寄存器1.IE2.IP3.TCON4.SCON 中断使用步骤1.配置中断源2.使能中断3.设置优先级4.编写中断服务程序5.清除中断标志 示例代码:外部中断使用示例代码…...
django连接mysql数据库
1.下载mysqlclient第三方库 2.在settings.py里连接数据库(提前建好) DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: 学生信息,USER: root,PASSWORD: 999123457,HOST: localhost,POST: 3306,} } 3.在models.py里创建一个类࿰…...
Python爬虫TLS
TLS指纹校验原理和绕过 浏览器可以正常访问,但是用requests发送请求失败。 后端是如何监测得呢?为什么浏览器可以返回结果,而requests模块不行呢? https://cn.investing.com/equities/amazon-com-inc-historical-data 1.指纹校…...
Docker 部署 MySQL 8 详细图文教程
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …...
基于Python的Diango旅游数据分析推荐系统设计与实现+毕业论文(15000字)
基于Python的Diango旅游数据分析推荐系系统设计与实现毕业论文指导搭建视频,带爬虫 配套论文1w5字 可定制到某个省份,加40 基于用户的协同过滤算法 有后台管理 2w多数据集 可配套指导搭建视频,加20 旅游数据分析推荐系统采用了Python语…...
网络安全java练习平台 js网络安全
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升…...
在做题中学习(90):螺旋矩阵II
解法:模拟 思路:创建相同大小的一个二维数组(矩阵),用变量标记原矩阵的行数和列数,每次遍历完一行或一列,相应行/列数--,进行对应位置的赋值即可。此题是正方形矩阵,因此…...
Educational Codeforces Round 174 (Rated for Div. 2)(ABCD)
A. Was there an Array? 翻译: 对于整数数组 ,我们将其相等特征定义为数组 ,其中,如果数组 a 的第 i 个元素等于其两个相邻元素,则 ;如果数组 a 的第 i 个元素不等于其至少一个相邻元素,则 …...
qemu启动aarch64 linux+ buildroot + 应用程序
1、Linux内核网址 https://www.kernel.org/ 2、安装依赖 sudo apt update sudo apt install -y build-essential qemu qemu-system gcc make bc flex bison libssl-dev libncurses5-dev libelf-dev 3、拉取kernel代码和编译kernel git clone --depth 1 https://git.ker…...
Sponge VS Spring:新兴力量与行业标准的碰撞
框架特性对比 特性SpongeSpring编程语言Go (Golang)Java设计范式低代码, 代码生成, 模块化IoC (控制反转), DI (依赖注入), AOP (面向切面编程)性能高性能, 执行速度快, 并发性好成熟的性能, 需要 JVM 调优, 启动时间可能较长成熟度与稳定性较新, 快速发展中非常成熟, 行业标准…...
推荐几款较好的开源成熟框架
一. 若依: 1. 官方网站:https://doc.ruoyi.vip/ruoyi/ 2. 若依SpringBootVueElement 的后台管理系统:https://gitee.com/y_project/RuoYi-Vue 3. 若依SpringBootVueElement 的后台管理系统:https://gitee.com/y_project/RuoYi-Cl…...
【分布式】Hadoop完全分布式的搭建(零基础)
Hadoop完全分布式的搭建 环境准备: (1)VMware Workstation Pro17(其他也可) (2)Centos7 (3)FinalShell (一)模型机配置 0****)安…...
JavaScript 异步编程:Promise 与 await 的关联与使用
在 JavaScript 中,异步编程是处理耗时操作(如网络请求、文件读写等)的核心机制。Promise 和 await 是两种常用的异步编程工具,它们密切相关,但又有各自的特点和适用场景。本文将深入探讨它们的关联、区别以及如何在实际…...
体验用ai做了个python小游戏
体验用ai做了个python小游戏 写在前面使用的工具2.增加功能1.要求增加视频作为背景。2.我让增加了一个欢迎页面。3.我发现中文显示有问题。4.我提出了背景修改意见,欢迎页面和结束页面背景是视频,游戏页面背景是静态图片。5.提出增加更多游戏元素。 总结…...
golang常用库之-swaggo/swag根据注释生成接口文档
文章目录 golang常用库之-swaggo/swag库根据注释生成接口文档什么是swaggo/swag golang常用库之-swaggo/swag库根据注释生成接口文档 什么是swaggo/swag github:https://github.com/swaggo/swag 参考文档:https://golang.halfiisland.com/community/pk…...
【可实战】Linux 常用统计命令:排序sort、去重uniq、统计wc
在 Linux 系统中,有一些常用的命令可以用来收集和统计数据。 一、常用统计命令的使用场景 日志分析和监控:通过使用 Linux 统计命令,可以实时监控和分析系统日志文件,了解系统的运行状况和性能指标。例如,使用 tail 命…...
【设计模式】【创建型模式】建造者模式(Builder)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…...
UE5.3 C++ 通过Spline样条实现三维连线,自己UV贴图。
一.制作了基于USplineComponent的画线插件,就是我们常说的样条线。 直接看怎么用,关于插件实现细节,后续会更新,看思路就行。通过ID,管理每一条线。移除删掉上一帧的线条Mesh。第一个点,是本身直接放过去。第二个点是…...
每日学习Java之一万个为什么
9.Class <?> class1 Myclass.class 为什么要有通配符?传给谁用的? 首先,这里的class特指某个对象在JVM中的元数据集合。 有普通、接口、数组、基本类型、 void 类型、局部类、匿名类、枚举、注解 1.类型安全:通配符允许…...
4、IP查找工具-Angry IP Scanner
在前序文章中,提到了多种IP查找方法,可能回存在不同场景需要使用不同的查找命令,有些不容易记忆,本文将介绍一个比较优秀的IP查找工具,可以应用在连接树莓派或查找IP的其他场景中。供大家参考。 Angry IP Scanner下载…...
华为昇腾920b服务器部署DeepSeek翻车现场
最近到祸一台HUAWEI Kunpeng 920 5250,先看看配置。之前是部署的讯飞大模型,发现资源利用率太低了。把5台减少到3台,就出了他 硬件配置信息 基本硬件信息 按照惯例先来看看配置。一共3块盘,500G的系统盘, 2块3T固态…...
一周学会Flask3 Python Web开发-http响应状态码
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在Flask程序中,客户端发出的请求触发相应的视图函数,获取返回值会作为响应的主体,最后生成…...
Javascript网页设计实例:通过JS实现上传Markdown转化为脑图并下载脑图
功能预览 深度与密度测试 对于测试部分,分别对深度和密度进行了测试: 注意!!!!!!!只实现了识别Markdown中的#代表的层级,所以不能使用其余标识符࿰…...
【Spring生命周期】Bean元信息配置阶段
引言 本系列将详细讲解Spring生命周期的13个阶段,从源码角度帮助我们更好的理解Spring框架和bean生命周期全流程 Bean信息定义4种方式 API的方式Xml文件方式properties文件的方式注解的方式 在 Spring 框架中,Bean 元信息配置阶段是整个 Bean 生命周…...
【iOS】SwiftUI状态管理
State ObservedObject StateObject 的使用 import SwiftUIclass CountModel: ObservableObject {Published var count: Int 0 // 通过 Published 标记的变量会触发视图更新init() {print("TimerModel initialized at \(count)")} }struct ContentView: View {State…...
ubuntu上如何查看coredump文件默认保存在哪个路径?
在 Ubuntu 系统中,可以通过以下几种方式来查看 coredump 文件默认保存的路径: 1. 查看core_pattern配置 core_pattern是一个内核参数,它决定了 coredump 文件的保存位置和命名规则。可以通过以下命令查看其当前值: cat /proc/s…...
技术总结汇总
目录 数据库 数据库系统原理 MySQL Redis Java Java 基础 Java 容器 Java 并发 Java 虚拟机 Java I/O 系统设计 系统设计基础 微服务 分布式 集群和负载均衡 灾备和故障转移 限流 降级和熔断 缓存 消息队列 设计模式 DDD领域驱动设计 开发框架和中间件…...
Java-如何将其他地方拉取的jar包导入本地maven环境
背景 公司的一个老旧二开项目,原项目维护方不合作了,提供的项目源码提供给到公司。项目中用到了一些原维护方内部的jar包,导致二开时依赖的这些部分全部报错。虽然在项目中直接导入此jar包可以解决报红报错问题,但是在使用maven打…...
Unity 聊天气泡根据文本内容适配
第一步 拼接UI 1、对气泡图进行九宫图切割 2、设置底图pivot位置和对齐方式 pivot位置:(0,1) 对齐方式:左上对齐 3、设置文本pivot位置和对齐方式,并挂上布局组件 pivot设置和对齐方式和底图一样&#…...
【组态PLC】基于博图V16和组态王六层双部电梯组态设计【含PLC组态源码 M008期】
控制要求 1)两台电梯同时运行时,共同享用一套外呼按钮。 2)当两台电梯同时去响应外呼信号时,两台电梯自动定向启动前往相应的楼层,当某一台电梯先行到达指定层楼时,另外一台电梯必须就近停靠平层…...
Python--数据类型(中)
1. 列表(list) 1.1 定义与特性 定义:有序、可变的容器,支持多种数据类型混合存储。 user_list ["奥力给", 98, True] empty_list [] # 空列表可变性:列表内部元素可修改,区别于字符串和元组。…...
学习总结2.19
首先就是对dfs和bfs的熟悉,dfs是一种递归函数,通过不断深搜来达到目的,通常用于寻找多少未知量,相较于bfs,编译难度更低一点;bfs多用于寻找最短路径之类,相较于dfs代码多了一部分队列的代码&…...
[Vivado报错] [Runs 36-527] DCP does not exist
一、错误原因解析 此错误表明Vivado在指定路径未找到.dcp(Design Checkpoint)文件,通常由以下原因导致: 路径过长或特殊字符:Windows系统路径长度限制(260字符)可能导致文件生成失败ÿ…...
深度学习的集装箱箱号OCR识别技术,识别率99.9%
集装箱箱号OCR识别技术是一项结合计算机视觉和规则校验的复杂任务,以下是其关键要点及实现思路的总结: 1、集装箱号结构:11位字符,格式为公司代码(3字母)和序列号(6数字)以及校验码(1数字)和尺寸/类型代码(可选),例如…...
基于java新闻管理系统,推荐一款开源cms内容管理系统ruoyi-fast-cms
一、项目概述 1.1 项目背景 在信息高速流通的当下,新闻媒体行业每天都要处理和传播海量信息。传统的新闻管理模式依赖人工操作,在新闻采集、编辑、发布以及后续管理等环节中,不仅效率低下,而且容易出现人为失误。同时࿰…...
网络安全要学python 、爬虫吗
网络安全其实并不复杂,只是比普通开发岗位要学习的内容多一点。无论是有过编程基础还是零基础的都可以学习的。网络安全目前可就业的岗位从技术上可分为两部分:web安全和二进制逆向安全。web安全是网络安全的入门方向,内容简单,就…...
ChatGPT行业热门应用提示词案例-AI绘画类
AI 绘画指令是一段用于指导 AI 绘画工具(如 DALLE、Midjourney 等)生成特定图像的文本描述。它通常包含场景、主体、风格、色彩、氛围等关键信息,帮助 AI 理解创作者的意图,从而生成符合要求的绘画作品。 ChatGPT 拥有海量的知识…...
网络安全钓鱼邮件测试 网络安全 钓鱼
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 如今,网络安全是一个备受关注的话题,“网络钓鱼”这个词也被广泛使用。 即使您对病毒、恶意软件或如何在线保护自己一无所知,您…...
写一个python组件
写一个python组件 核心功能代码命令行接口打包配置安装与测试注意 写一个python组件,具体的:项目结构设计:定义你的项目的目录结构。编写核心功能代码:实现你想要的功能。创建命令行接口(CLI):使用argparse或click库来…...
deepseek-v3在阿里云和腾讯云的使用中的差异
随着deepseek在各大云商上线,试用了下阿里云和腾讯云的deepseek服务,在回答经典数学问题9.9和9.11谁大时,发现还是有差异的。将相关的问题记录如下。 1、问题表现 笔者使用的openai的官方sdk go-openai。 因本文中测验主要使用阿里云和腾讯…...
DevOps自动化部署详解:从理念到实践
在软件开发日益快速迭代的今天,如何以高效、稳定且可重复的方式将代码变更从开发环境自动部署到生产环境成为企业竞争的重要因素。DevOps 正是在这一背景下应运而生,它打破开发、测试、运维之间的壁垒,通过自动化工具和流程,实现持…...
systemverilog刷题小记
1、systemverilog的队列特性 1.1队列的基础操作 方法语法时间复杂度示例结果头部插入q.push_front(item)O(1)q.push_front(5)[5, ...]尾部插入q.push_back(item)O(1)q.push_back(8)[..., 8]头部删除q.pop_front()O(1)x q.pop_front()[...]尾部删除q.pop_back()O(1)x q.pop_…...
jetbrains IDEA集成大语言模型
一、CodeGPT CodeGPT是由CSDN打造的一款生成式AI产品,专为开发者量身定制。它能够提供强大的技术支持,帮助开发者在学习新技术或解决实际工作中的各种计算机和开发难题1。 idea集成 1.在线安装:直接在线安装 2.离线安装 JetBrains Mar…...
23. AI-大语言模型-DeepSeek赋能开发-Spring AI集成
文章目录 前言一、Spring AI 集成 DeepSeek1. 开发AI程序2. DeepSeek 大模型3. 集成 DeepSeek 大模型1. 接入前准备2. 引入依赖3. 工程配置4. 调用示例5. 小结 4. 集成第三方平台(已集成 DeepSeek 大模型)1. 接入前准备2. POM依赖3. 工程配置4. 调用示例…...
Ubuntu学习备忘
1. 打开Terminal快捷键 ctrl alt t 2.Ubuntu22.04的root没有默认初始密码, 为root设置密码,下面链接的step1, How to allow GUI root login on Ubuntu 22.04 Jammy Jellyfish Linux - LinuxConfig...