自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(126)
  • 收藏
  • 关注

原创 c++实现在同一台主机两个程序实现实时通信

对于进程间通信方式有很多种,对于本机两个程序中可以实时通信那么应该选择哪个呢?很多人最快想到的就是socket通信。适用于跨网络的进程间通信,具有网络透明性、灵活性和安全性高的优点,但性能开销较大,延迟较高!适用于同一台机器上的进程间通信,具有高性能、低延迟和高吞吐量的优点,但需要手动管理同步机制,安全性较低。所以我们优先使用共享内存来实现,在智能驾驶等工业场景中使用非常多。

2025-03-06 17:15:28 469

原创 c++11Trailing Return Type 后置返回类型 ->

后置返回类型在C++中,尤其是使用模版的时候,经常会看到如下形式的代码有些同学可能会对第二行中的这个->产生疑惑,这个是什么东西?这里的->是用来显式声明函数的返回类型。

2025-02-27 14:14:02 374

原创 c++中所有互斥锁,及锁管理器介绍

c++中所有互斥锁,及锁管理器介绍。

2025-02-27 13:15:51 396

原创 std::async介绍,及std::future介绍,并与std::thread对比

std::async是 C++11 标准库中引入的一个函数模板,用于启动一个异步任务。它是<future>头文件中的一部分,主要用于实现异步编程,允许程序在不阻塞主线程的情况下执行任务。返回一个 std::future,该线程最终将保存该函数调用的结果。接下来就根据官方文档来详细看一下这个函数。<future>

2025-02-26 16:03:39 810

原创 c++实现生产者消费者,由略懂到懵逼,进阶版

c++生产者消费者模型

2025-02-25 22:23:56 253

原创 c++实现将输入的字符串首字母变成大写,字符串中的下划线替换成空格,并将后面的第一个字符变成大写

c++实现将输入的字符串首字母大写,字符串中的下划线替换成空格,并将后面的第一个字符变成大写。把小写字母转换为大写字母

2025-02-14 11:13:09 128

原创 c++20新特性

模块通过引入“导入(import)”和“导出(export)”概念,替代传统的头文件机制,减少了编译时间,避免头文件互相包含的问题,使代码组织更清晰。概念为模板编程提供了更强大的类型约束机制,使得代码更加清晰、易读,并且能够在编译期更早地发现错误。是一个轻量级、非拥有的视图,可以表示连续的对象序列,提供了一种安全且高效的方式来处理数组、提供了范围(Range)的概念,支持范围的迭代、算法操作等,进一步扩展了STL的功能。更安全,会自动处理线程的清理工作,并提供内置的停止机制。的格式化字符串功能,比传统的。

2025-02-14 10:56:25 892

原创 c++内存泄漏的排查解决

内存泄漏是C++编程中常见的问题,但通过使用合适的工具(如Valgrind、VLD)、采用智能指针和RAII技术,以及进行代码审查和静态分析,可以有效减少内存泄漏的发生,提高程序的稳定性和性能。

2025-02-14 10:27:51 357

原创 不使用库函数如何判断系统的大小端

无论使用什么方式,其核心思想都是利用char*来访问一个大于一个字节类型的值,访问到的是第一个字节即是大端,最后一个字节就是小端。

2025-01-17 17:48:51 120

原创 C++中的define与const的区别

C++中的define与const的区别

2024-07-29 01:33:30 520

原创 c++代码,对一个数组,里面随机含有若干个-1,与其他任意大于0的整数,实现对该数组除-1外其他数字从小到大排序,要求-1所在的位置不变

c++代码,对一个数组,里面随机含有若干个-1,与其他任意大于0的整数,实现对该数组除-1外其他数字从小到大排序,要求-1所在的位置不变

2024-07-29 01:01:54 184

原创 正则表达式c++11std::regex

std::regex 是C++11标准库中的一个类,用于处理正则表达式。它遵循ECMAScript语法规范,并提供了一系列函数和操作符来执行模式匹配、搜索、替换等操作。以下是std::regex的一些基本语法元素

2024-07-29 00:38:23 880

原创 实现一个c++程序,实现对输入的mac地址做判断,如果不是mac地址就返回错误,反之返回正确

实现一个c++程序,实现对输入的mac地址做判断,如果不是mac地址就返回错误,反之返回正确

2024-07-28 19:55:55 387

原创 c++实现一个函数,对一个输入的整数,代表时间秒数,将其转换成时间格式字符串,如“01:09:11“,代表1小时,09分,11秒

c++实现一个函数,对一个输入的整数,代表时间秒数,将其转换成时间格式字符串,如“01:09:11“,代表1小时,09分,11秒

2024-07-28 19:03:39 472

原创 c++实现将输入的字符串首字母大写,字符串中的下划线替换成空格,并将后面的第一个字符变成大写

这个基本功能不难,可能很多同学会对字母变成大写有些迷茫,可能会使用ASCII值来进行转换。不要迷茫,这里介绍一个C 库函数。c++实现将输入的字符串首字母大写,字符串中的下划线替换成空格,并将后面的第一个字符变成大写。把小写字母转换为大写字母。我们有了这个函数,这个功能就容易多了。函数检查给定字符是否是字母。

2024-06-13 15:47:59 446

原创 求助-内存对齐相关问题

我个人未使用过6个字节对齐方式,所以回答到是6个字节,毕竟寻址都是2的整数倍。但是具体为什么丢失,或者是其它对齐方式丢失,我不知道如何作答。最近接到深圳xcsj的第二次面试邀请,其中对于内存对齐这里有一些问题不明白,网上也没有找到相关资料,所以求助各位专家帮忙解答。Q2:4,6,8字节对齐,那些对齐方式网络传输(tcp)会产生数据丢失,为什么?Q1:4字节与8个字节哪个对齐方式更有优势?我个人认为具体情况具体分析吧。求助-内存对齐相关问题。

2024-01-03 21:24:45 491

原创 c++中使用互斥量

当 std::lock 成功的获取一个互斥量上的锁,并且当其尝试从另一个互斥量上再获取锁时,就会有异常抛出,第一个锁也会随着异常的产生而自动释放,所以 std::lock 要么将两个锁都锁住,要不一个都不锁。不过,事情没那么简单,比如,当有多个互斥量保护同一个类的独立实例时,一个操作对同一个类的两个不同实例进行数据的交换操作,为了保证数据交换操作的正确性,就要避免数据被并发修改,并确保每个实例上的互斥量都能锁住自己要保护的区域。的好处在于,可以将所有 std::lock 替换掉,从而减少潜在错误的发生。

2023-12-18 14:21:51 972

翻译 c++中什么是RAII(官方文档释义)

资源获取即初始化),或称 RAII,是一种 C++ 编程技术[,它将必须在使用前请求的资源(分配的堆内存、执行线程、打开的套接字、打开的文件、锁定的互斥体、磁盘空间、数据库连接等——任何存在受限供给中的事物)的生命周期绑定与一个对象的相绑定。RAII 保证资源可用于任何会访问该对象的函数(资源可用性是一种,这会消除冗余的运行时测试)。它亦保证所有资源在其控制对象的生存期结束时,以获取顺序的逆序释放。

2023-12-14 17:05:02 255

原创 c++标识线程

直接通过std::thread对象的成员函数get_id()来获取。如果thread对象没有与任何执行线程相关联,get_id()将返回std::thread::id对象,它按照默认的构造方式生成,表示线程不存在(实际测试时,直接core dumped)。还可以通过在当前线程中调用std::this_thread::get_id()获取。线程id是唯一的,如果两个值不同就代表两个不同线程,或者某线程不存在(实际测试,不存在时,编译会报错)线程ID类型为std::thread::id,它有。

2023-12-14 16:45:55 507

原创 运行时线程的数量stdthreadhardware_concurrency()

这个函数会返回真正并发在一个程序中的线程数量。例如, 多核系统中, 返回值可以是CPU核芯的数量。返回值也仅仅是一个提示, 当系统信息无法获取时, 函数也会返回0。

2023-12-14 16:24:16 514

原创 c++转移线程所有权

假设要写一个在后台启动线程的函数, 并想通过新线程返回的所有权去调用这个函数, 而不是等待线程结束再去调用;或者创建一个线程, 并在函数中转移所有权, 都必须要等待线程结束。c++标准库中含有不少资源占有类型,如std::ifstream、std::unique_ptr类、std::thread等都是可以移动但是不可复制的。因此对于一个具体的执行线程,其归属权可以在几个std::thread实例间转移。thread支持移动操作的意义是,函数可以便捷的向外部转移线程的归属权。

2023-12-14 15:55:48 456

原创 c++向线程函数传递参数及编译错误排查

虽然上述代码可以正常编译运行,但是还有需要我们关注的,func函数第二个参数是一个string类型,但是,字符串是以const char* 的方式传递的,进入新线程的上下文环境后,才转换成string的。原因是,thread的构造函数并不知情func函数的参数,所以是直接复制我们提供的参数s,然而线程库内部代码会把参数的副本当成。类别(只能移动,不可复制),并以右值的形式传递。这样就会有歧义,第17行,编译器会认为这是一个声明。为了避免这样不必要的麻烦,我们采用同一初始化方式。编译的时候会发现报错了,

2023-12-14 12:11:11 938

原创 c++中explicit关键字用法

(1) 指定构造函数或转换函数 (C++11 起)或推导指引 (C++17 起)为显式,即它不能用于隐式转换和复制初始化。(2) explicit 说明符可以与常量表达式一同使用。当且仅当该常量表达式求值为 true 时函数为显式。explicit 说明符只可出现于在类定义之内的构造函数或转换函数 (C++11 起)的。可以看到,调用show函数的时候,自动将参数整型1转换成了A类型。当表达式中为ture表示禁止使用隐式转换,false表示允许使用。c++20中还可以使用表达式来控制是否使用隐式转换。

2023-11-28 15:57:01 478

原创 算法--单链表

解法:这个比较容易,直接对比两个两个链表节点,小的节点直接插入到返回的新链表上。

2023-10-26 21:36:46 519

原创 计算机系统的基本概念

本文主要以hello.c这个程序的整个生命周期来简单了解一下计算机系统结构的基本概念。此刻,hello.c源程序已经被编译系统翻译成了可执行目标文件hello,并被存放在磁盘上。要想在 Unix系统上运行该可执行文件,我们将它的文件名输入到称为shell的应用程序中进行执行shell是一个命令行解释器,它输出一个提示符,等待输入一个命令行,然后执行这个命令。如果该命令行的第一个单词不是一个内置的shell命令,那么shell就会假设这是一个可执行文件的名字,它将加载并运行这个文件。

2023-09-10 23:39:21 652

原创 程序执行的四个阶段

链接阶段:请注意,hello程序调用了printf函数,它是每个C编译器都提供的标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的he11o.o程序中。汇编阶段:接下来,汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序(relocatable object program)的格式,并将结果保存在目标文件hello.o中。结果就得到了另一个C程序,通常是以。

2023-09-10 17:14:03 635

原创 libevent源码学习7---libevent常用设置

libevent 有一些被整个进程共享的、影响整个库的全局设置。必须在调用libevent 库的任何其他部分之前修改这些设置,否则,libevent 会进入不一致的状态。

2023-08-26 15:36:02 386

原创 libevent源码学习6---链接监听器evconnlistener

evconnlistener 机制提供了监听和接受 TCP 连接的方法。

2023-08-25 19:04:11 442

原创 libevent源码学习5---数据封装evBuffer

libevent 的 evbuffer 实现了为向后面添加数据和从前面移除数据而优化的字节队列。evbuffer 用于处理缓冲网络 IO 的“缓冲”部分。它不提供调度 IO 或者当 IO 就绪时触发 IO 的 功能,这是 bufferevent 的工作。

2023-08-25 17:51:46 267

原创 libevent源码学习4--数据缓冲Bufferevent

很多时候,除了响应事件之外,应用还希望做一定的数据缓冲。libevent为此提供了一种通用机制,即bufferevent。bufferevent 由一个底层的传输端口,一个读取缓冲区和一个写入缓冲区组成。与通常的事件在底层传输端口已经就绪,可以读取或者写入的时候执行回调不同的是,bufferevent 在读取或者写入了足够量的数据之后调用用户提供的回调。

2023-08-25 15:18:36 320

原创 libevent源码学习3---事件event

libevent 的基本操作单元是事件。libeventevent_baseevent_base简单来说就是一个已经产生的信号,但是还没有传递给任何进程,此时该信号的状态就称为未决状态。

2023-08-24 22:13:09 301

原创 记一个宏定义写法#define HT_FIND(name, head, elm) name##_HT_FIND((head), (elm))

我相信看完例子你就明白这种写法了。仔细看看是不是这个宏的调用有点像线程定义的写法。最近在看libevent源码,看到一个有趣的宏写法。在vscode鼠标悬停该宏调用处,就清晰明了了。定睛一看是一个宏,##是连接符。

2023-08-24 17:25:09 143

原创 libevent源码学习2---事件循环event_loop

一旦有了一个已经注册了某些事件的 event_base,就需要让 libevent 等待事件并且通知事件的发生。0x010x020x04默认情况下,函数运行event_base其中没有已经注册的事件为止。执行循环的时候 ,函数重复地检查是否有任何已经注册的事件被触发 (比如说,读事件的文件描述符已经就绪,可以读取了;或者超时事件的超时时间即将到达 )。如果有事件被触发,函数标记被触发的事件为 “”,并且执行这些事件。在 flags 参数中设置一个或者多个标志就可以改变的行为。如果设置了。

2023-08-09 19:13:12 376

原创 libevent源码学习1---创建event

Libevent是一个用于开发可扩展性网络服务器的基于事件驱动(event-driven)模型的非阻塞网络库。

2023-08-09 16:08:35 328

原创 ubuntu下载安装libevent

官网上下载最新稳定版本,然后拖到你的linux系统中,解压。或者可是使用wget在线下载。本文下载的是最新版本,其他版本同操作。上述程序,捕捉2号信号,并设置捕捉超时时间5秒。ubuntu下载安装libevent。若出现下面的文件,则安装成功。进入解压后的目录,执行。

2023-08-09 00:31:20 1096

原创 C++多线程编程(包含c++20内容)

本文详细介绍c++多线程编程内容(涵盖c++20),内容很全,很详细,全文17000余字。你确定不看看嘛?

2023-07-28 13:10:44 1755

原创 Linux系统ubuntu22.04安装最新版的gcc13.1.0编译器,支持c++20、23

Linux系统ubuntu22.04安装最新版的gcc13.1.0编译器,支持c++20、23,本文全程上机实操,包含解决若干个问题,如下载包失败,执行代码/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.31' not found等

2023-07-14 18:52:19 20139 37

原创 C++容器的概述

标准库中的容器是泛型数据结构,特别适合保存数据集合。使用标准库时,几乎不需要使用标准的C风格数组、编写链表或者设计栈。容器实现为类模。除array、bitset外,大部分标准库容器大小灵活多变,都能自动生长或者收缩,以容纳更多的或者更少的元素。和固定大小的C风格数组相比,有着巨大的优势。由于本质的标准C风格数组的大小是固定的,因此容易受到溢出的破坏。如果数据溢出,轻则导致程序崩溃,重则导致某些类型的安全受到攻击。使用标准库容器,程序遇到这种问题的可能性就会小的很多。

2023-07-12 13:18:38 214

原创 解决win10开机卡顿、配置很高但是玩游戏卡顿掉帧等问题

最近组装了一台高配置的新电脑,装好了各种驱动、软件等。发现系统开机后卡顿一分钟左右(加载应用配置等),但是我的系统启动项明明就没多少,不应该是这样的情况,而且会出出现玩游戏卡顿掉帧等情况。前前后后重装系统若干次、重装主板bios、显卡驱动等若干次。directX修复、驱动人等生该用的都用了。下面介绍解决了我这些问题的方法,80%上述问题都可以修复。如果你也出现这些问题,尝试着使用该方法看看可不可以。

2023-06-29 12:34:12 3338

原创 edge设置下载位置失败解决办法

本人使用edge下载软件,已经设置了下载到F盘,但是依然会下载到C盘,设置失败!经过探索,在设置中下载选项中每次下载都询问我该做些什么关闭就可以了。

2023-06-22 21:40:33 1058 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除