- 博客(91)
- 收藏
- 关注
原创 【c++】【STL】unordered_set 和 multiset
定义空的 unordered_set定义并初始化通过迭代器初始化// 自动去重拷贝构造初始化//拷贝构造赋值初始化。
2025-03-17 15:23:20
188
原创 【c++】【STL】set的常用用法
set<int> s;可以使用greater<>使set 以降序方式存储。(默认为升序)可以通过传入仿函数或 Lambda 表达式自定义排序规则。操作set 复杂度解释插入O(log n)基于红黑树的平衡插入删除O(log n)通过旋转和调整保持平衡查找O(log n)二叉搜索树的搜索。
2025-03-17 14:36:01
766
原创 【c++】【智能指针】什么情况下不适合智能指针
会引入额外的性能开销,std::unique_ptr。,但在某些场景下仍存在额外的构造、析构或转移开销。【c++】【智能指针】什么情况下不适合智能指针。大多数场景下用到的都是 unique_ptr。shared_ptr:共享所有权。
2025-03-16 21:46:26
264
原创 【c++】【线程】【信号量】三个线程顺序打印1--100
这样可以确保在后续的代码中,只有获得该锁的线程能够进入临界区,从而防止多个线程同时访问共享资源导致数据竞争。是 C++ 标准库中用于管理互斥锁(mutex)的一个对象创建语句,它在作用域内自动管理锁的获取与释放。,你可以确保进入临界区的代码在离开作用域时自动释放锁,从而避免死锁和资源泄漏问题。这会唤醒线程 A,使其结束等待,重新获取锁后检查条件,然后继续执行后续代码。当 unique_lock 对象离开作用域时,自动释放锁。当线程 B 修改了某个数据,并使。的构造函数会自动调用。当执行到这行代码时,
2025-03-15 14:37:20
1103
原创 【linux】【文件】文件权限基础
只有所有者有读、写权限,其它用户没有任何权限(在符号表示法中,go= 表示将用户组和其他用户的权限全部清除。这意味着所有人都对该文件或目录拥有完全的权限,这在某些情况下可能会带来安全风险,因此使用时需谨慎。使用数字(八进制)表示权限时,三个数字分别对应所有者、用户组和其他用户的权限。除了数字表示法外,还可以使用符号表示法来修改权限。命令用于修改文件或目录的权限。只有所有者有读、写权限,其它用户没有任何权限。(所有者、用户组、其他人)对。的读、写、执行权限。例如,下面的命令将为。
2025-03-10 19:49:01
342
原创 【算法】【c++】两个栈实现一个队列
入队时:直接将新元素压入 inStack,保持 O(1) 时间。出队时:如果 outStack 为空,将 inStack 全部转移到 outStack,这个转移过程会将元素顺序反转,从而使得最早入队的元素出现在 outStack 栈顶;如果 outStack 非空,直接操作其栈顶。由于每个元素最多只转移一次,所以整体的均摊时间复杂度是 O(1)。这种设计利用了两个栈之间的顺序反转特性,有效地模拟了队列的 FIFO 行为,同时在实际应用中表现出了高效性。
2025-03-10 19:28:37
1385
原创 【git】【网络】【项目配置运行】HTTP 协议的微型简易 Web 服务器---tinyEasyMuduoWebServer
csdn项目:原文链接:https://blog.csdn.net/weixin_45178775/article/details/122257814github链接:https://github.com/wyewyewye/tinyEasyMuduoWebServer/blob/main/README.md项目介绍:项目基于C++语言、陈硕老师的muduo网络库、mysql数据库以及jsoncpp,服务器监听两个端口,一个端口用于处理http请求、另一个端口用于处理发送来的json数据。
2025-03-09 23:13:21
1240
原创 【git】ssh配置提交 gitcode-ssh提交
之前一直用的是gitee和阿里云的仓库,前两天想在gitcode上面备份一下我的打洞代码和一些资料 就直接使用http克隆了下来。在提交的时候他一直会让我输入账号和密码,但是我之前根本没有设置过这个,根本没法搞,后来试了登陆的账号和密码也不是,找了半天也找不到,后来还是干脆配置一下ssh算了在这里设置:我用的是RSA类型。
2025-03-07 18:48:12
512
原创 【AI】【大模型】deepseek本地部署
大模型部署这里,我之前确实没有接触过,只是大概知道可以将大模型下载下来在本地跑,并且大部分使用的语言是python,此次也只是一个简单的尝试。使用到的软件分别是 ollama+AnythingLLM,下载的大模型是 deepseek-r1:1.5b。
2025-03-06 14:40:05
572
原创 【Linux】【网络】UDP打洞-->不同子网下的客户端和服务器通信(成功版)
【Linux】【网络】UDP打洞–>不同子网下的客户端和服务器通信(成功版)根据上个文章的分析 问题可能出现在上面 我这里重新查找资料怀疑:1 NAT映射可能。2 NAT映射保存,并且 NAT 可能会在短时间内,需要一直保持映射。有些 NAT 设备会因为短时间内没有数据而回收端口映射,导致服务器提供的 IP:Port 失效。:双方定期发送保活包以防 NAT 超时关闭映射。3 服务器只是向双方发送了IP和端口后直接退出了,并未发送数据包给客户端,导致。
2025-03-04 20:36:15
1319
原创 【Linux】【网络】UDP打洞-->不同子网下的客户端和服务器通信(未成功版)
上次说基于UDP的打洞程序改了五版一直没有成功,要写一下问题所在,但是我后续又查询了一些资料,成功实现了,这次先写一下,我认为未成功的排查错误的部分也很重要,如果想直接看成功的可以直接看我的下一篇文章。首先 基于上篇文章的UDP打洞逻辑这里直接将图贴出来:我的逻辑思路:(ps:会把代码贴到最后面。
2025-03-04 15:08:51
1079
原创 【Linux】【网络】NAT-->不同子网下客户端无法通信原因
NAT 是一种地址转换技术,用于解决IPv4 地址短缺问题。它允许多个设备共享一个公网 IP访问互联网。路由器是专门用于管理网络流量的设备,用于在多个网络之间选择最佳路径并转发数据包。概念作用关键特点网关(Gateway)连接不同网络设备访问外网必须经过网关NAT(网络地址转换)内网设备共享公网 IP解决 IPv4 地址不足问题路由器(Router)选择最佳路径、转发数据连接多个网络,通常带有 NAT 功能路由器是一个包含 NAT 功能的网关,它帮助内网设备访问外网。
2025-03-02 17:01:33
1153
原创 【c++】【线程池】固定式线程池(FixedThreadPool)
使用 function 包装器和using类型重命名 设置一个Task的可调用对象(可理解为) 这个Task也就是我们的任务。
2025-02-26 22:05:40
543
原创 【c++】【线程池】线程池模式
参考:https://blog.csdn.net/qq_51931826/article/details/145468543。会调用第三层的异步服务层, 从而执行任务, 并且异步服务层会响应来自第二层的同步队列的请求, 从而保证任务的执行顺序。, 处理来自User的任务请求, 上层的请求可能是并发的, 这些请求并不会马上被处理, 而是会被放入到第二层的。第三层是异步服务层, 会有若干个线程同时处理排队层中的任务。
2025-02-23 19:23:38
584
原创 【c++】【线程池】常用线程池分类
根据线程池的特性和用途,常见的线程池类型包括:FixedThreadPool(固定式线程池):CachedThreadPool(缓存式线程池):SingleThreadExecutor(单线程池):ScheduledThreadPool(定时任务线程池):WorkStealingPool(工作窃取线程池):
2025-02-23 15:08:23
399
原创 【c++】【线程池】可调用对象包装器
std::function<返回值类型(参数类型列表)> diy_name = 可调用对象;// 绑定非类成员函数/变量auto f = std::bind(可调用对象地址, 绑定的参数/占位符);// 绑定类成员函/变量auto f = std::bind(类函数/成员地址, 类实例对象地址, 绑定的参数/占位符);用来包装各种类型的可调用对象,使其具有统一的接口。std::bind用来将可调用对象和其参数绑定,生成一个新的可调用对象(仿函数),使得函数调用更加灵活。占位符(是。
2025-02-22 11:24:45
870
原创 【c++】【线程池】线程池概述
线程池(Thread Pool)是一种多线程编程的技术,它的核心思想是并将它们组织起来管理。当任务到达时,线程池可以直接来处理,而无需每次都创建新线程。线程池能够显著,并能够有效地。线程池的基本结构:1.任务队列(TaskQueue):用于存放。通常是一个线程安全的队列。2.工作线程:线程池中的线程,负责从任务队列中取出任务并执行。3.线程池管理:负责创建、管理和销毁工作线程。它还负责任务的调度和队列的管理。
2025-02-21 21:42:54
946
原创 【Linux】【网络】frp-->不同子网下的客户端和服务器通信
前两天在进行socket()网络编程并进行测试时,发现在不同wifi下两个电脑无法进行连接,大概去查找了如何解决 看到可以使用这个快速反向代理实现。
2025-02-20 17:40:15
1863
原创 【Linux】【网络】Libevent整个的使用流程总结(与接口函数结合)
我大概画了一个图,大家将就看一下:大概描述:以epoll为例(前面有提到)
2025-02-18 14:52:57
1218
原创 【Linux】【网络】Libevent 内部实现简略版
通过抽象事件的注册、回调的设置和数据的读写,简化了网络I/O的处理过程,尤其是在多线程或高并发的环境下非常有用。它结合了evbuffer进行数据缓存,支持自动处理粘包和分包问题。通过和可以动态管理事件的启用与禁用。的使用可以显著简化基于事件驱动的网络应用开发,提高代码的可维护性和扩展性。本身是在单线程模式下运行的,即使你设置了线程安全选项,也只会对缓存区进行线程安全管理,而不会改变 libevent 的单线程事件处理模型。libevent的事件循环 (event_base。
2025-02-17 22:24:10
840
原创 【Linux】【网络】Reactor补充+Libevent
句柄的作用是,当内核检测到就绪事件时,它将通过句柄来通知应用程序这一事件。在LINUX环境下,I/0事件对应的句柄是文件描述符,信号事件对应的句柄就是信号值。,即IO事件、信号和定时事件,统一称为。一个事件源通常和一个。
2025-02-17 20:42:51
528
原创 【Linux】【网络】Reactor模式
Reactor 模式是一种的设计模式,同步I/O中注册socket 上的读就绪事件。(主线程监听上的事件)2)3)当socket上有数据可读时,epoll_wait() 通知。主线程则将socket事件放入。4)睡眠在请求队列上的某个被唤醒,它从socket读取数据,并处理客户请求然后往epoll内核事件表中注册该socket上的就绪事件。5)主线程调用epoll_wait() 等待 socket 可写。6)当socket 可写时,epoll_wait()通知主线程。主线程将socket。
2025-02-17 13:57:16
747
原创 【Linux】【网络】Libevent基础
libevent的核心流程是:创建事件基础 (event_base),创建事件对象 (event)并将其添加到事件循环()中,启动事件循环 () 处理事件,回调处理事件,然后清理资源。通过这些步骤,libevent可以高效地实现异步 I/O 和定时任务。事件基础创建与释放事件创建与添加事件循环回调处理:用户定义的回调函数定时器处理事件清理。
2025-02-17 11:01:29
981
原创 【Linux】【文件】文件描述符管理的三大表
进程级文件描述符表系统级文件表描述文件的动态操作 多个file可以指向一个inode文件系统 i-node 表描述文件的静态信息fdtablefdtablefilefdtablefilefilefdtablefilefilefiledup()filefileinodef_inodef_poslseek()fd2filef_posinode文件的静态信息fileinodeinodeinodei_mappingfiledup()fileinodefdtablefdfilefileinodeinode。
2025-02-16 22:18:45
659
原创 【c++】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗?
子线程崩溃导致进程崩溃的情况: 如果子线程因为非法内存访问(如空指针解引用)或者未捕获的异常(导致 std::terminate),则进程会崩溃。子线程崩溃但不导致进程崩溃: 如果子线程抛出异常且异常被捕获,或者使用了 pthread_detach 来分离子线程,主线程仍然能够继续执行,进程不会崩溃。
2025-02-16 19:37:17
1138
原创 【Linux】【进程】epoll内核实现总结+ET和LT模式内核实现方式
当某一进程调用方法时,Linux内核会创建一个结构体,这个结构体中有两个成员与epoll的使用方式密切相关.
2025-02-16 14:48:18
1166
原创 【Linux】【进程】epoll内核实现
8.在**回到ep_insert()**函数中。ep_item_poll()调用完成之后,会将epitem中的fllink字段添加到struct file中的f_ep_links链表中,这样就可以通过struct file找到所有对应的struct epollitem对象,进而通过struct epollitem找到所有的epoll实例对应的struct eventpoll。6.ep_insert()函数中,首先判断epoll实例中监视的文件数量是否已超过限制,没问题则为待添加的文件。
2025-02-13 20:32:02
1190
原创 【Linux】【进程】死锁
pstack:用于快速获取所有线程的调用栈,帮助初步定位哪些线程可能陷入等待状态。gdb:用于深入调试,可以附加到运行中的进程,通过查看各线程的详细堆栈信息、局部变量及锁状态,帮助你确定死锁的根源。结合这两种工具,可以有效定位和解决 Linux 进程中的死锁问题,从而提高系统的稳定性和性能。
2025-02-12 20:26:35
775
原创 【c++】c++11 智能指针 unique_ptr、shared_ptr、weak_ptr
c++要手动释放堆内存,c++11 中,引入了三种智能指针:unique_ptr、shared_ptr 和 weak_ptr,用于自动管理动态分配的内存,防止内存泄漏等问题。1.unique_ptr: 实现,支持移动语义,适用于需要的场景。2.shared_ptr: 实现,适用于多个所有者同一资源的场景。3.weak_ptr: 用于打破循环引用,避免内存泄漏。独占对象所有权,同一时间,一个对象和对应资源只能被一个unique_ptr占有。
2025-02-12 16:27:48
868
原创 【c++】字符串 string 以及与右值结合
是 C++ 标准库中的一个用于处理字符串的类,定义在头文件<string>中。封装了一个可变长度的字符数组,可以。在使用指向字符数据时例如字符串”yyyyyyy“字符串存储在数据区,并且是只读属性,多个char类型指针指向同一字符串”yyyyyyy“,他们的地址是一样的。不能够对其进行修改。如果要对其修改,使用一个可以修改的来存储字符串。
2025-02-11 16:12:47
728
原创 【c++】右值,右值引用
表示在内存中,可以对其取地址操作符()获取地址。例如,变量、数组元素、引用等都是左值。:不可以对其取地址操作符()获取地址。例如,字面量(如整数42)、临时对象、表达式的结果等都是右值。:表达式运算过程中产生的临时量,具名为左值,不具名为右值。右值引用使用符号&&表示,专门用于。通过右值引用,程序员可以捕获将要被销毁的临时对象,从而对其资源进行再利用或转移。
2025-02-11 15:11:59
702
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人