- 博客(138)
- 资源 (4)
- 收藏
- 关注
原创 c++ 基础题目lambda
a.可以赋值给一个与其类型兼容的类型的对象 std::function<int(int, int)> lambda = [](int x, int y) { return x + y;b.使用具体的 lambda 类型(函数指针) int (*lambda1)(int, int) = [](int x, int y) { return x + y;c. 推导类型decltype([](int x, int y) { return x + y;decltype 用于推导一个表达式的类型,而不是像。
2025-03-17 17:11:16
721
转载 goland 断点调试的问题
因依赖问题要求GO版本需要从1.18.x版本升级到1.23.x,升级后,Test 启动 debug时,发现打断点的红点一闪而过,出现一个失效的标志(一个灰色圆圈+斜杠),在经过百度大法后,原来高版本(1.20及以上版本)会出现debug断点无效的现象。经过资料查阅,发现是因为go高版本问题,导致dlv插件失效,github上提供了源代码,可以clone下来打包,并把dlv文件放到指定的目录。goland 新版本(大于等于23年版本)goland 新版本(大于等于23年版本)最后一步 重启goland。
2025-03-13 11:10:07
51
转载 reactor
当某个连接有新的数据可以处理时,操作系统通知应用程序,线程从阻塞状态返回,开始进行业务处理。如果是建立连接请求事件,则由 Acceptor 通过 Accept 处理连接请求,然后创建一个Handler对象处理连接完成后的后续业务处理。基于线程池复用线程资源:不必再为每个连接创建线程,将连接完成后的业务处理任务分配给线程进行处理,一个线程可以处理多个连接的业务。handler只负责响应事件,不做具体的业务处理, 通过read读取数据后,会分发给后面的worker线程池的某个线程处理业务。
2025-03-05 12:12:04
28
原创 valgrind 工具helgrind使用
valgrind --tool=helgrind --log-file=./valgrind.log ./game_50
2024-08-20 19:54:05
188
转载 启用交换内存swap
现在我们知道了可用的存储空间,我们可以开始在文件系统中创建一个交换文件。我们将在根目录(/)中创建一个名为 swapfile 的文件,当然,如果你愿意,也可以给文件取其他名字。文件必须分配我们想要的交换文件空间的大小,并且应该在一个连续的块中创建。在这之前,我们应该调整交换文件的权限,以便除了 root 帐户之外的任何人都无法读取。目前我们的交换文件已启用,但当我们重新启动时,服务器将不会自动启用该文件以供使用。目前,我们的文件已经创建,但系统不知道这个文件应该用作交换空间。添加完毕后,保存并关闭文件。
2024-08-14 20:01:51
143
原创 asyn 使用
std::future仅在创建它的std::promise(或者std::async、std::packaged_task)有效时才有用,所以可以在使用前用valid()判断。std::promise负责存储, std::promise也是一个模板类,它提供了存储异步执行结果的值和异常的一种方式。std::future负责访问,std::promise负责存储,同时promise是future的管理者。std::promise 对象可以保存某一类型 T 的值。future 对象读取(可能在另外一个线程中)
2024-08-08 11:15:44
272
原创 跳表啊啊啊啊
查找: 红黑树查找操作的时间复杂度在最坏情况下为O(logn)红黑树在查找单个节点时效率很高,但如果需要按照区间查找数据,比不上跳表。对比平衡树, 跳表的实现和维护会更加简单, 跳表的搜索、删除、添加的平均时间复杂度是 O(logn)跳表在原来的有序链表上加上了多级索引,通过索引来快速查找;跳表,又叫做跳跃表、跳跃列表,在有序链表的基础上增加了“跳跃”的功能。跳表实际上是一种增加了前向指针的链表,是一种随机化的数据结构。按每两个节点生成一个索引,则有第一层索引节点的个数为n/2。2. 空间复杂度O(n)
2024-07-23 12:33:18
210
原创 VMware虚拟机扩充硬盘
通过VMware构建虚拟机,使用一段时间后发现虚拟机硬盘空间不足,需要在VMware虚拟机中添加新的硬盘并挂载到指定目录下。再次查看磁盘情况,/dev/sdb1说明分区成功,名称是你磁盘名称+设置的分区号。2、对磁盘进行分区,如果磁盘名称不是 /dev/sdb请根据实际名称修改。3、选择虚拟机磁盘类型SCSI(S),点击下一步。5、将分区挂载信息添加到/etc/fstab。6、开始挂载新分区到创建的指定目录。4、创建新虚拟磁盘,点击下一步。4、创建需要将磁盘挂载到的目录。2、选择硬盘,然后点击下一步。
2024-07-05 12:07:39
1526
原创 一致性哈希算法原理详解
一、普通 hash 算法 (取模算法):在了解一致性哈希算法之前,我们先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的应用场景。1、普通 hash算法 与 使用场景描述:假设我们有三台缓存服务器,用于缓存图片,我们为这三台缓存服务器编号为 0号、1号、2号,现在有3万张图片需要缓存,我们希望这些图片被均匀的缓存到这3台服务器上,以便它们能够分摊缓存的压力。
2024-06-20 15:03:36
617
原创 定时器实现数据结构比较
大小堆:大小堆的插入和删除操作相对简单,主要涉及上浮(向上调整)和下沉(向下调整)操作,以维护堆的性质。1. 红黑树获得最小值的时间复杂度是O(h), 最小堆的是O(1),因为最小值永远是根节点.红黑树:红黑树的插入和删除操作相对复杂,需要根据红黑树的性质进行调整和旋转,以保持平衡性。2.红黑树相同的时间定时任务,后面需要挂一个桶 类似mutilmap。
2024-01-22 16:28:53
538
1
原创 地图移动逻辑
之前经常发生进行同步的时候,第三方客户端上的角色最终停止的位置会比主客户端多走了几步的问题,这时因为对最后一个同步坐标也做了预测的缘故。做预测, 在没有收到下一个同步点的时候,客户端自己做一个位移预测,让角色保持位移的状态,客户端简单地认为角色会保持当前的位移方向和速度继续运动(事实上也确实是保持运动状态的情况居多,变化居少)会有收到最后一个点的时候,角色已经做了预测,并且走超了的情况,这种情况只能按照终点坐标做一个会拉的操作了,或者客户端设定了预测上限,在偏差值不大的情况下允许这种偏差存在也可以。
2024-01-10 20:08:43
508
原创 stl容器
std::stack 和 std::queue: 它们是容器适配器,实际上依赖于其他容器实现(例如 vector, deque, 或 list),因此其 size 复杂度与底层容器的 size()` 复杂度相同。std::forward_list: 时间复杂度为 O(N),其中 N 是容器中的元素数。std::map 和 std::multimap: 时间复杂度为 O(1)(C++11 及以后的版本)。std::set 和 std::multiset: 时间复杂度为 O(1)(C++11 及以后的版本)。
2023-12-08 15:31:34
423
原创 linux api daemon,后台运行进程
函数将当前进程转变为守护进程。在守护进程中,可以执行需要在后台运行的任务。在示例中,守护进程会打印一条消息,然后睡眠10秒,最后打印另一条消息。函数仅适用于Unix/Linux系统,不适用于所有操作系统。在其他操作系统上实现守护进程可能需要使用不同的方法和函数。函数是一个标准的Unix/Linux系统调用,用于将当前进程转变为守护进程。函数可以简化将进程转变为守护进程的过程。例如,下面的代码演示了如何使用。函数的返回值为0表示成功,返回-1表示失败。在Linux系统中,确实有一个名为。
2023-11-29 16:11:42
528
原创 gcc编译优化
thinLTO是GCC引入的一种折衷方案,它结合了整个程序模式和LTRANS模式的优点. 在链接阶段,链接器可以使用这些索引文件来进行全局的优化和代码生成。总体而言,LTRANS和ThinLTO都是有效的链接时优化方式,但根据项目的规模、编译时间和优化需求来选择适合的模式。O3在O2的基础上进行更多的优化,例如使用伪寄存器网络,普通函数的内联,以及针对循环的更多优化。O2会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间。
2023-11-24 12:28:40
834
原创 eventfd
flags:eventfd文件描述符的标志,可由三种选项组成:EFD_CLOEXEC、EFD_NONBLOCK和EFD_SEMAPHORE。EFD_CLOEXEC:表示返回的eventfd文件描述符在fork后exec其他程序时会自动关闭这个文件描述符;EFD_SEMAPHORE表:表示将eventfd作为一个信号量来使用。initval:创建eventfd时它所对应的64位计数器的初始值;EFD_NONBLOCK:设置返回的eventfd非阻塞;一个消费者,多个生产的时候,一个消费者,一个生产者。
2023-10-12 20:42:30
790
1
原创 信号驱动io
免去了select的阻塞与轮询,当有活跃套接字时,再由注册的handler 处理, 无需进程主动去check活跃的socket,把检查工作交给内核,进程只需要确定合适处理拷贝即可。不过可以对TCP监听套接字可以使用SIGIO,因为对于监听套接字,产生SIGIO信号的唯一条件是某个新连接完成了。当套接口上有可用数据时,内核将发送SIGIO信号给进程,此时信号处理程序将被调用,并且可以执行相应的操作。这么多条件都会触发SIGIO信号,导致应用进程对该信号一头雾水,没法确定套接字具体发生了什么事情。
2023-09-26 20:38:15
178
原创 nginx
[nginX-1.7.2] worker进程的诞生: ngx_start_worker_processes-PCliangtao-ChinaUnix博客
2023-09-26 17:07:45
111
原创 docker
7. docker run -it -v /root/ceshi:/root centos /bin/bash docker 启动一个centos并且挂载到ceshi目录。docker exec -it 88d23bcbe1f2 /bin/bash , 进入不停止容器。4.docker run -it centos /bin/bash 启动并进入容器。docker rm -f $(docker ps -aq) 删除全部容器。docker attach 容器id , 进入不停止容器。
2023-09-11 17:27:36
222
转载 内存序atomic
截止到此,分析了memory_order_acquire&memory_order_acquire组合以及memory_order_release&memory_order_consume组合的对重排的影响:当对读操作使用memory_order_acquire标记的时候,对于写操作来说,写操作之前的所有读写都不能重排到写操作之后,对于读操作来说,读操作之后的所有读写不能重排到读操作之前;在未进行任何同步的条件下,即使线程A先执行,线程B后执行,线程B读取到的x的值也不一定是最新的值。
2023-09-11 09:49:59
129
原创 真伪随机数
算法生成随机数,比如c++中的 mt19937梅森旋转算法即为一种软件层面的随机数生成算法算法。如果知道了seed和算法的具体实现,别人就可以知道你生成的随机数序列。不是跨平台的,依赖于硬件具体的实现,C++标准没有严格要求,编译器可能会偷懒,用伪随机数糊弄你(特指mingw),而。,原理是用某个仪器一直探测环境中的物理量,将该物理量作为随机数,比如 Intel 和 AMD CPU指令集中的。指令,C++ 中random_device就是利用RDRAND实现的。
2023-08-31 20:43:14
176
原创 gdbserver
B 主机gdb -q Document/trunk/runtime/game/game。A主机 gdbserver :9101 game_2。这时候a主机已经跑来了。其他使用和方法一一样。
2023-07-21 16:16:13
102
原创 条件变量笔记
如果此时存在一个低优先级的线程在等待锁,那么一旦锁被释放,那么这个锁就会被低优先级的线程争抢去,而不会被wait的线程得到,导致wait线程阻塞,无法返回。, 只有本线程和要唤醒的线程,竞争这把锁的时候,,,,就不会存在这种情况.因为唤醒线程和解锁,都是需要再内核态完成的,而先解锁,再唤醒,内核会一次将这两个操作完成,这样就减少了用户态和内核态切换的次数,从而节省了资源。:唤醒后的线程在等待为该互斥锁加锁,一旦锁被释放,wait线程就会立即加锁,而不会发生上述,锁被抢占额度情况。
2023-06-21 17:46:19
463
原创 c++11 atomic 内存序
5.test_and_set() 函数检查 std::atomic_flag 标志,如果 std::atomic_flag 之前没有被设置过,则设置 std::atomic_flag 的标志,并返回先前该 std::atomic_flag 对象是否被设置过,如果之前 std::atomic_flag 对象已被设置,则返回 true,否则返回 false。3. 初始状态c++20之前不确定 ,c++20之后是false。7. c++20以前只提供了上面两个方法。
2023-06-15 16:54:26
682
原创 linux内存
同时堆是一个连续空间,并且堆内碎片由于没有归还 OS ,如果可重用碎片,再次访问该内存很可能不需产生任何系统调用和缺页中断,这将大大降低 CPU 的消耗。2.malloc小于128k的内存,使用brk分配内存, malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0)brk分配的内存需要等到高地址内存释放以后才能释放(例如,在B释放之前,A是不可能释放的,这就是内存碎片产生的原因,什么时候紧缩看下面),而mmap分配的内存可以单独释放。
2023-06-13 14:34:49
818
原创 tcp 神秘的40ms 延迟,关闭nagle算法
默认 TCP_NODELAY=0,表示关闭 TCP_NODELAY 选项,也就是说,关闭了禁止延迟,也就是说有延迟,即采用了 Nagle 算法,会延迟 40ms。
2023-05-06 16:59:42
474
原创 linux 各个版本区别
同一个版本的类unix往往有多个不同的安装镜像,这些镜像往往以livecd、livedvd、netinst等结尾,其中,带live的镜像是一个光盘启动的镜像,也就是说可以从该光盘启动进入系统并可以体验。一般而言,cd的容量小于dvd,所以cd版本的安装文件要小于dvd版本,所带的软件包也会少一些。也可以安装到计算机,但是有些内容可能还需要再次到网站下载(自动)liveCD版本:和liveDVD一样,也是一个体验版和DVD体验版唯一的区别就是CD的存储空间要小一些,文件也会小一些,里面的软件包少一点。
2023-04-20 12:17:33
752
busybox-x86_64
2019-12-18
MySQL-community-5.1.72-1.rhel5.x86_64.rpm-bundle.tar
2019-08-29
VA_X.dll,Visual Assist X安装说明
2019-08-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人