自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 CLOSE-ON-EXEC 的重要性

当我们杀死 B 进程后,A 与 B 的连接并未断开(现象为 A 与 B 连接的 fd 仍显示为 ESTABLISHED 状态)。要解决这个问题,我们首先想到 B 进程被杀死时应该关闭与 A 的连接,但结果并不符合按预期。究其原因,B 启动 C 后,C 接管 B 的上下文(通俗来说),包括 B 与 A 的连接。所以我们后来发现,A 与 B 的连接变成了 A 与 C 的连接。项目组成是3个模块(进程):A,B,C。A 与 B 保持 tcp 连接,有需要时,A 向 B 发送控制指令,B 会 启动 C进程。

2024-04-03 11:07:22 154

原创 std::ifstream::tellg()未能正确获得文件大小的问题

2 是 std::ios::eofbit 的值。使用以下函数获取文件大小时,可能得到返回值为 2。

2023-10-10 09:49:55 272

原创 原来移动赋值是 原 子 操 作!

高并发测试do(),并伴随偶尔的update()。然后想到了移动赋值可能是原子操作,问gpt,得到了肯定结果。今天项目里写了一个类,大体如下。但测试结果出乎意料,竟然没逝。

2023-06-14 10:14:31 108

原创 Makefile中定义版本号,巨坑

最初是这样定义的,咋看没问题。修改为(只有最后两行不同)仔细比较后就知道坑在哪里。

2023-05-30 11:00:32 239 2

原创 别再用ftime!!有大坑!!

某个业务执行时需要写日志,但调用完日志后(日志中有调用ftime),调用处附近的变量值莫名地被修改了。换成C++的std::chrono就没这b问题了。gdb显示问题出在ftime()上。用gdb的watch定位到日志上。其次,它会污染内存。

2023-05-16 16:10:12 378

原创 C++ Effictive 第6章 继承与面向对象设计 笔记

因此用基类指针声明一个继承类对象,并且基类声明了一个带默认参数的纯虚函数,并且继承类重声明了此函数无默认参数版本时,调用函数会调用继承类函数,并用基类给定的的默认参数。此举下,如果子类函数与父类函数参数也一致,父类函数仍然被遮掩。private也意味着in-implemented-terms-of,与复合相比,尽量使用复合,必要时采用private继承。virtual func() 父类可以提供实现,为了让子类继承接口和实现。子类声明与父类函数同名的函数时,父类函数会被遮掩。strategy设计模式。

2023-02-21 19:13:18 265

原创 shared_ptr的一个使用不慎

pop出智能指针之后,在下一次pop时阻塞,导致上次pop的智能指针引用计数未即时归零。本来等指针指针析构时调用对象的析构函数,发现偶尔会不调用,找了一下午才发现这问题。后面加了两个if后问题解决。

2022-12-13 17:57:28 74

原创 linux 无缓冲立即读取输入的字符

原理就是从/dev/tty文件读取。/dev/tty存放你终端的信息。C++写法C写法,有坑,每读取一个字符都会打开一次该文件,超过一定数量会不被linux允许。此代码来自网络。可以将tty声明为静态,或者每次打开后都关闭该文件

2022-12-06 16:28:43 355

原创 修改一个SQL控制台的心得

现在已经基本做完了,所以没法改动了。如果一开始能想到这点,会方便很多。 为输入的每个字符生成坐标,目前最难做的上下左右功能也会变得简单。 某函数ioctl()可以获取屏幕能容纳的行数和列数。 用两个头对头(入口对入口,也即出口对出口)的栈实现(并不唯一)3.使用无阻塞输入 做这个东西要么输入时不用缓冲区,要么用键盘监控。 但是不知道在用终端ssh连接centos时能不能监听键盘事件。

2022-12-05 18:34:38 277

原创 libevent-bufferevent遇到的坑

1. 多线程操作段错误2. 对evbuffer加锁后还是段错3. 在2情况下创建的buffeevent为nullptr4. 建议加入水位线控制

2022-11-30 11:25:40 254

原创 自定义<set><map>的hash函数时遇到的问题

Hash和Equal为对象时, 其operator()后应加上const。

2022-10-21 12:01:50 99

原创 测试std::unordered_map的hash冲突

std::unordered_map的实现为hash表,所以hash值范围越小,越容易出现冲突,效率越低。m 查找 0.004000 0.018000 0.146000。m2 查找 0.004000 0.004000 0.004000。m用的是自定义的hash函数hash值只有0和1,m2用默认hash函数。n为数据量,times为测试次数,下面结果取最后一次测试结果。n为100,1000,10000时。

2022-10-09 17:14:04 379

原创 函数中有多处返回,多次写释放申请的内存太麻烦?

代码中可能会遇到这种情况,函数中申请了内存,函数中进行多次判断,根据不同情况返回不同的值,每个return前都需要释放申请的内存。解决方式:用unique_ptr代管申请的内存,析构时自动释放。

2022-08-23 11:49:32 96

原创 当编译链接时error:undefined reference to xxx

C++在编译期间不能决定模板参数的类型,如果在编译时有实例调用了类模板函数,则未定义。与这个情况相似:不完整类型不能用于定义该类型的实例,只能用于定义该类型的指针实例。在我的代码中,问题出在模板类函数的声明和定义分别放在.h和.cpp中。是的,没错,这是问题所在。链接时决定模板参数类型。...

2022-08-18 17:07:14 396

原创 error:type/value mismatch at ... ::iterator

修改方式:在 std::list前加类型声明typename。加上typename,让编译器知道你是在声明一个类型而不是访问静态成员。原因:有没有觉得class::xxx的写法像是在访问类里的静态成员。iterator是stl类的嵌套类。错误在编译以下代码时出现。...

2022-08-18 15:03:07 160

原创 C++ std::map用迭代器遍历删除遇到的坑

需求是这样的 表面上看没什么问题,迭代器也在删除后做了赋值,感觉自己避开了坑,很开心。然而当map只有一个元素的时候,在erase(it)后,it的值是map.begin(),此时map.begin()==map.end()。for结束一次循环,++it,那么it = map.begin() + 1,不再等于map.end(),循环继续,并且不会再停下来。在这个项目中,锁也没有释放,就会让后面的线程全部堵在自旋锁上,cpu占用 += 100%。题外话可能会有人吐槽这种遍历复杂度太高N^3。准备增

2022-07-08 10:41:27 2593

原创 psql double类型精确度问题

数据类型real和double precision是不精确的、变精度的数字类型。 在所有当前支持的平台上,这些类型是IEEE标准 754 二进制浮点算术(分别对应单精度和双精度)的实现, 一直到下层处理器、操作系统和支持它的编译器。 不准确意味着一些值不能准确地转换成内部格式并且是以近似的形式存储的,因此存储和检索一个值可能出现一些缺失。 处理这些错误以及这些错误是如何在计算中传播的主题属于数学和计算机科学的一个完整的分支, 我们不会在这里进一步讨论它,这里的讨论仅限于如下...

2022-04-26 11:16:20 933

原创 docker学习意外收获

docker cp [src] [dest]在容器和主机之间拷贝docker search key-word在docker hub查找dockerdocker rmi image删除镜像docker rm CONTAINER删除实例docker build -t tag将build 的镜像加上tag,就像v1, v2, latest...docker info总览docker信息docker export -o tarfile -...

2022-03-17 16:43:59 1007

原创 linux安装cmake报错can‘t find OpenSSL

用yumyum install libssl-devyum install openssl或者apt-get安装apt-get install libssl-devapt-get install openssllibssl-dev是必须装的,openssl没测试

2022-03-16 16:50:40 566

原创 将vector<string>写入文件,但文件大小与期望不一致

打算用 vector 装 1024 * 1024 * 64 个长度为 16 的 string,共计1GB大小,随机生成内容,写成文件,作为压缩测试的文件。但是用以下语句,写出来的文件大小每次都不一样。ofstream.write((char *)vector.data(), 16 * vector.size());想了很久才悟到,vector 上的对象是在内存上是连续的,但指的是 string 对象。string 的内容未必在(应该完全不在)vector 上。vector 上的连续空

2022-03-03 10:33:07 283

原创 开源项目找不到第三方头文件

问题来自于找snappy压缩算法库时,找到了Google的开源项目然后clone,cmake,make。cmake的时候,出现了error第1、4个error都是找不到目录下的CMakeLists.txt。直接到对应目录下touch一个空的CMakeLists.txt就能解决,因为我不需要用googletest和benchmark。第2、3个error是找不到目标:gtest和gmock。这种比较权威的项目一般会有cmake的选项,可以在cmake时取消某些部分。个人感觉这种

2022-02-28 14:40:04 331

原创 centos7换阿里源

1.备份本地yum源[root@bogon ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak2.获取阿里yum源配置文件[root@bogon ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo3.更新yum缓存[root@bogon ~]# y

2022-02-28 10:16:01 2972

原创 rm指令参数介绍

rm[OPTION]...FILE...DescriptionThis manual page documents the GNU version ofrm.rmremoves each specified file. By default, it does not remove directories.这页手册记录了rm的GNU版本。rm移除每个给定的文件。默认情况下,不会移除目录。If the-Ior--interactive=onceoption is given, ...

2022-02-25 14:48:21 3484

原创 nvcomp压缩算法原理

cascade高效压缩整形数据。由RLE、Delta encoding、Bit-packing组合。RLE:1,1,1,1,3,3 =》值(1,3) 数(4,2);Delta:1,3,2,4,3 =》 1,2,-1,2,-1 相对前一个数的偏移量;Bit-packing:5,6,9,5 =》 5(0,1,4,0) 相对基数的偏移量;LZ4面向byte数据。简单高速。适用于任意数据。LZ4通过匹配重复字符串进行压缩,不是全文...

2022-02-24 16:38:12 977

原创 C++ primer阅读笔记 继承

若基类中声明了纯虚函数,继承类必须重写该函数。virtual void fun1() = 0;含有纯虚函数的基类是抽象基类,它定义了类的接口,但将接口的实现交给继承类。派生类的成员和友元只能通过派生类访问基类的受保护对象。class Base{protected: int a;};class Inherite: public Base{ friend void f1(Base &b){ //编译器将报错 b.a = 0; }

2022-02-21 16:51:28 190

原创 分布式日志聚集系统开发总结

项目功能主要功能:接收来自多个节点的日志,按节点名存入文件。分析功能:设定多个Tag,将日志与Tag匹配。最终可以让用户指定Tag,将所有匹配日志存入指定文件。对外接口类LogService主要对外接口。启动后持续运行,接收节点日志,交给Handler类处理。用户可以设定并行线程数。TagManager管理Tag。单例。Analyst分析数据。生成Tag文件。内部实现类FileWriter打开文件写入。Han...

2022-02-21 09:51:46 467

原创 C++开发经验之谈1

返回类成员引用时注意是否有修改,导致原引用可能出错某些成员是否可以作为处理它的类的成员,而不是以传参的形式将成员传给处理它的类不能为了效率滥用引用树查找虽然快,但多次查找不如用迭代器进行一次查找,后面就用迭代器某些时候,取指针所指值拷贝不如直接拷贝指针用{}很轻易地限制unique_ptr的作用域。stl.reserve()预留空间但不构建对象,stl.resize()分配空间且构建对象。while(flag)可能被编译器优化共享队列front(); pop.

2022-02-18 16:54:44 140

原创 Linux mmap

将磁盘内容一一映射到内存空间。将磁盘IO操作转换为对内存的操作。void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset);start:映射到内存的起始地址。通常设置为NULL,函数将自动在内存上找到合适的地址,映射成功后函数返回该地址。length:长度。字节数。prot:PROT_WRITE内存可写。PROT_READ内存可读。在大多数系统上,此标志和PROT_EX...

2022-02-17 14:52:32 383

原创 linux读写文件过程

页缓存是磁盘和内存之间的缓冲。读取文件:查找页缓存命中:返回页缓存未命中:将文件加载到页缓存,然后返回页缓存写入文件:查找页缓存命中:直接修改页缓存未命中:将文件加载到页缓存,然后修改被修改的页缓存被标记为脏页可以通过调用fsync(fd)将脏页写到磁盘或者等待pdflush进程达到某些条件后自动写入某些条件:延时/脏页所占内存比例/内存余量/脏页在内存中的时间pread()和pwrite()可在多线程应用中进行原子性读写。...

2022-02-17 13:43:19 859

原创 Linux内存管理初探

总结自网络资料,做了部分验证。——————————————————————————————————————————Linux为进程提供4GB的虚拟内存(如果不了解虚拟内存,就当成物理内存)。如果把内存想象成从地址低到高的顺序表,竖着放,地址高在上,低在下。(更严谨一点,小端模式下)则从上到下,从高到低,内存中储存的内容依次为:内核栈 ↓MMAP ↓堆 ↑BSSdata代码段操作系统保留区域1、内核大小1GB。2、栈上面是内核,不可访问,

2022-02-16 18:13:12 357

原创 C++虚函数表

在对象创建时,编译器自动地在对象的起始地址处创建一个虚函数表,表里是类的虚函数地址。如果子类将其继承但不重载虚函数,子类对象的起始地址也会存父类的虚函数,若有重载,将虚函数替换为对应的子类重载函数地址。...

2022-02-16 13:41:52 411

原创 C++内存对齐

class A{ int a; char b;};class B : A{ char c;};int main(){ printf("%d %d\n", sizeof(A), sizeof(B));}输出 8 8此例说明两个问题:1、内存对齐2、子类数据在基类数据之后

2022-02-16 11:52:51 366

原创 queue线程安全

queue非线程安全大佬封装成线程安全的,接口与原<queue>一致,但无法拷贝(锁)#pragma once#include <queue>#include <mutex>#include <condition_variable>template <typename T>class SharedQueue{public: SharedQueue(); ~SharedQueue(); T &am

2022-02-08 17:32:09 1577

原创 fputs线程安全

fputs()是线程安全的。fputs_unlocked()是非线程安全的,在多线程中使用需要像使用锁(mutex)一样,使用flockfile() 或 ftrylockfile() 函数后才能安全地在多线程中使用。来自IBM的文档

2022-02-08 14:48:35 263

原创 C++ 重载前置和后置++/--运算符

要想同时定义前置和后置运算符,必须首先解决一个问题,即普通的重载形式无法区分这两种情况。前置和后置版本使用的是同一个符号,意味着其重载版本所用的名字将是相同的,并且运算对象的数量和类型也相同。为了解决这个问题,后置版本接受一个额外的(不被使用) int类型的形参。当我们使用后置运算符时,编译器为这个形参提供一一个值为0的实参。尽管从语法上来说后置函数可以使用这个额外的形参,但是在实际过程中通常不会这么做。这个形参的唯一作用 就是区分前置版本和后置版本的函数,而不是真的要在实现后置版本时参与运算。...

2022-01-26 09:17:20 487

原创 C++primer阅读笔记 13章 拷贝控制

一个类必须拥有拷贝构造、移动构造、拷贝赋值、移动赋值、析构函数。如果它们未被显式定义,编译器将会自动合成它们。默认的拷贝构造函数会将源对象的成员依次复制到新对象中,如果成员中有类类型,还会调用它们的拷贝构造函数。拷贝初始化通常调用拷贝构造函数完成,有时也会调用移动构造函数。拷贝初始化不仅在我们定义类对象时发生,也会在传递非引用参数、返回非引用对象、初始化列表时发生。拷贝构造函数的参数必须为引用类型。如果不是引用类型,当构造发生时,形参必须拷贝实参,由此调用拷贝构造函数,为了调用拷贝构造函数,又必

2022-01-24 15:10:45 381

原创 C++ primer阅读笔记 泛型算法

find函数底层实现是使用类的 == 重载一一对比,这意味着类必须支持 == 。find(begin, end, value),若未查找到value,返回end。vector<int> v{1,2,3,4,5};cout << accumulate(v.begin(), v.end(), 100);cout << accumulate(v.begin(), v.end(), 100, [] (int &a, int &b) { re

2022-01-24 11:08:38 519

原创 C++primer笔记 流和容器

“ 由于不能拷贝IO对象,因此我们也不能将形参或返回类型设置为流类型。进行I0操作的函数通常以引用方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的。”whlie(cin >> str) do something;cin >> str返回流的状态,只要流未出错,cin >> str始终为真。difference_type对于不能相减(一般是非随机访问)的迭代器还是有意义的...

2022-01-24 10:11:35 555

原创 C++primer阅读笔记 第7章类

“ 在一些简单的应用程序中,类的用户和类的设计者常常是同一个人。尽管如此,还是最好把角色区分开来。当我们设计类的接口时,应该考虑如何才能使得类易于使用;而当我们使用类时,不应该顾及类的实现机理。”const(常量)对象只能访问const成员函数,和全部成员(如果public),但只读。一般(变量)对象可以访问全部成员和成员函数,但对const成员只读。const成员函数只能访问const成员函数。普通成员函数可以访问全部成员函数。简单理解:const对象是常量,当然只读。一般对象..

2022-01-24 09:34:34 352

原创 C++11primerP1第6章函数

内联函数,inline声明,直接在调用的地方展开编译,省去调用函数的开销。通常用于,体积小,调用频繁,逻辑简单的函数。constexpr声明表达式或函数为常量,让编译器能在运行前计算出表达式和函数的返回值。assert()括号内的表达式,如果为真无事发生,如果为假程序异常。下面情况中,fun(a)调用第一个函数,fun(b)调用第二个函数。a是int不能绑定到const&,b和第二个函数精确匹配。void fun(int& a);void fun(cons

2022-01-21 16:14:36 270

空空如也

空空如也

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

TA关注的人

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