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

C++高频知识点(十四)

文章目录

  • 66. 程序什么时候应该使用多线程,什么时候单线程效率高?
  • 67. 死锁的原因和避免
    • 死锁的避免
    • 预防死锁:破坏持有并等待条件
  • 68. TCP拥塞控制
    • 四个阶段轮换过程描述
  • 69. C++的内存管理
  • 70. 构造函数可以是虚函数吗,析构函数呢

66. 程序什么时候应该使用多线程,什么时候单线程效率高?

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

67. 死锁的原因和避免

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

死锁的避免

在这里插入图片描述

预防死锁:破坏持有并等待条件

#include <iostream>
#include <thread>
#include <mutex>std::mutex mutex1;
std::mutex mutex2;void thread1() {while (true) {std::lock_guard<std::mutex> lock1(mutex1); // 持有资源1std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟一些工作std::lock_guard<std::mutex> lock2(mutex2); // 持有资源2// 执行临界区代码std::cout << "Thread 1 working..." << std::endl;}
}void thread2() {while (true) {std::lock_guard<std::mutex> lock2(mutex2); // 持有资源2std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟一些工作std::lock_guard<std::mutex> lock1(mutex1); // 持有资源1// 执行临界区代码std::cout << "Thread 2 working..." << std::endl;}
}int main() {std::thread t1(thread1);std::thread t2(thread2);t1.join();t2.join();return 0;
}

在这个示例中,线程1和线程2分别以相反的顺序获取两个互斥锁,容易导致死锁。为了避免死锁,可以修改代码,使线程在获取资源时遵循相同的顺序。

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

68. TCP拥塞控制

TCP拥塞控制是为了防止网络过载和拥塞而采取的一系列机制和算法。TCP拥塞控制的目标是高效地使用网络资源,同时避免网络拥塞导致的数据丢失和传输延迟。

TCP拥塞控制主要包括四个关键算法:慢启动(Slow Start)、拥塞避免(Congestion Avoidance)、快速重传(Fast Retransmit)和快速恢复(Fast Recovery)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四个阶段轮换过程描述

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

69. C++的内存管理

C++的内存管理涉及多个方面,包括栈内存和堆内存的分配与管理、对象的生命周期管理、以及避免和处理内存泄漏

RAII (Resource Acquisition Is Initialization),中文含义为『资源获取即初始化』,是C++中一种非常重要的资源管理技术。
在这里插入图片描述

在这里插入图片描述

70. 构造函数可以是虚函数吗,析构函数呢

在这里插入图片描述

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

http://www.dtcms.com/a/314556.html

相关文章:

  • 如果发送的数据和接受的数据不一致时,怎么办?
  • 从 Hive 数仓出发,全面剖析 StarRocks、MySQL、HBase 的使用场景与区别
  • Linux-Day02.Linux指令
  • Vue 3 + AntV X6 实现流程编辑功能
  • C语言-指针[指针数组和数组指针]
  • 【web应用】Maven:Java 生态的构建与依赖管理利器
  • LeetCode算法日记 - Day 1: 移动零、复写零
  • 排序算法——归并排序(图文演示)
  • 最小二乘法MSE
  • 【Linux】重生之从零开始学习运维之GTID复制
  • 【动态规划 | 回文字串问题】动态规划解回文问题的核心套路
  • docker镜像源配置教程,以及解决安装好docker配置镜像源后,出现报错。Job for docker.service failed
  • 在 C++ 中实现类似 Vue 3 的 Pinia 状态管理库
  • C++模板知识点3『std::initializer_list初始化时逗号表达式的执行顺序』
  • 2025-08月特辑---私有化部署gitea仓库
  • Android UI 组件系列(九):ListView 性能优化与 ViewHolder 模式实战
  • 信息安全概述
  • LightRAG:大模型时代的低成本检索利器
  • HCIP笔记1
  • OpenCV计算机视觉实战(18)——视频处理详解
  • 经典设计模式
  • 电商系统想撑住大流量?ZKmall开源商城靠微服务 + Spring Boot3 解决单体架构难题
  • VS2019 Qt5.14.2 OpenCV4.4.0 全流程安装及开发环境搭建与配置(工业相机环境配置)
  • SpringMVC在前后端分离架构中的执行流程详解
  • 【C++指南】STL stack 完全解读(一):从入门到掌握基础操作
  • 【C#】操作Execl和Word文件-2
  • 深入理解基础 IO:从 C 库函数到系统调用的全景指南
  • MCP安全机制深度剖析:权限控制与数据保护最佳实践
  • 液体泄漏识别误报率↓75%:陌讯多模态融合算法实战解析
  • vllm启动Qwen/Qwen3-Coder-30B-A3B-Instruct并支持工具调用