首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

女朋友:七夕,你的 HttpServer 又崩了......

HttpConnection::onRead方法调用socket的recv函数收取数据时,返回为0,表明对端断开了连接 // 4. ...我为 HttpSessionManager对象定义了一个 std::set 容器 m_pendingDeleteSessions,当某个 HttpSession 对象需要删除时,先在这个容器中记录下要删除的...::shared_ptr  m_spEventLoop;     int                         m_fd; }; crash 问题必,当我把 HttpSessionManager...,那释放 HttpConnection 导致 EventLoop 也会被释放。...高性能服务器架构设计总结4 从零实现一个 http 服务器 服务器开发中网络数据分析与故障排查经验漫谈 服务器开发通信协议设计介绍 one thread one loop 思想 业务数据处理一定要单独开线程

41910

当我们谈论shared_ptr的线程安全性时,我们在谈论什么

有的同学确实没有了解过的,就盲猜了一个,答道:用static变量存储的引用计数。...还有一个指针执行一个控制块的地址,里面存放了所管理数据的数量(常说的引用计数)、weak_ptr的数量、删除器、分配器等。...在多线程环境下,管理同一个数据的shared_ptr在进行计数的增加或减少的时候是线程安全的? 答案是肯定的,这一操作是原子操作。...std::thread td([sp1] () {....}); 或者参数传递的shared_ptr是传递,而非引用: void fn(shared_ptr sp) { ... }...,有一个处理逻辑是根据查到的value,去判断是否满足一个条件,然后清空一个unordere_map的变量(调用clear成员函数)。这两个回调函数中都有可能触发这个clear操作。

1.1K30
您找到你想要的搜索结果了吗?
是的
没有找到

【新技术分享】C++17 最新进展

C++标准委员最近在夏威夷的科纳召开了一次会议,大家可能关心最新的进展,但是按照以往的情况,某些文件需要很久才会公开。...P0061R1 支持__has_include P0134R0 引入非静态成员变量的拷贝构造函数//not sure P0136R1 重写继承构造器(core issue 1941 et al) P0160R0 删除一元运算符的预设...应该提供long ::abs(long) 和long long ::abs(long long)?...volatile-qualified类型 2462.std::ios_base::failure 被过度规范 2466.allocator_traits::max_size()默认表现是错误的 2469...虽然我几乎花了所有的时间在库工作组中,但是还是不能跟进所有的内容。最终版文件我会在Reddit分享各个模块的进展。 原文链接:https://linux.cn/article-6563-1.html

1.1K60

C++ 认识容器的迭代器

需要删除人数为0的记录,删除代码如下: map countMap; for(map::iterator it=countMap.begin();it!...(1)对于节点式容器(map, list, set)元素的删除,插入操作导致指向该元素的迭代器失效,其他元素迭代器不受影响; (2)对于顺序式容器(vector,string,deque)元素的删除...、插入操作导致指向该元素以及后面的元素的迭代器失效。...解决方法有二,还是以上面的 map 容器为例,示例删除操作的正确实现: **方法一:**当删除特定的元素时,删除元素前保存当前被删除元素的下一个元素的迭代器。...->second << endl; } } 程序输出结果: 2 4 anhui 1 shandong 1 这种方法的缺点:虽然实现两个map的交换的时间复杂度是常量级,一般情况下,拷贝带来的时间开销大于删除指定元素的时间开销

59120

C++认识容器的迭代器

需要删除人数为0的记录,删除代码如下: map countMap; for(map::iterator it=countMap.begin();it!...(1)对于节点式容器(map, list, set)元素的删除,插入操作导致指向该元素的迭代器失效,其他元素迭代器不受影响; (2)对于顺序式容器(vector,string,deque)元素的删除...、插入操作导致指向该元素以及后面的元素的迭代器失效。...解决方法有二,还是以上面的map容器为例,示例删除操作的正确实现: 方法一:当删除特定的元素时,删除元素前保存当前被删除元素的下一个元素的迭代器。...>second<<endl; } } 程序输出结果: 2 4 anhui 1 shandong 1 这种方法的缺点:虽然实现两个map的交换的时间复杂度是常量级,一般情况下,拷贝带来的时间开销大于删除指定元素的时间开销

1.2K10

C++ 树的重心和直径

树的重心也称为质点,有一个很官方的定义:如果在树中选择某个节点并删除,这棵树将分为若干棵子树,统计子树节点数并记录最大。取遍树上所有节点,使此最大取到最小的节点被称为整个树的重心。...根据一个具体树结构解释重心的获取过程。 删除节点1,得到3棵子树,其子树的节点数量依次为3、4、1,最大为4。 删除节点2,可得到3棵子树,其子树的节点数量依次为1、1、6,最大为6。...删除节点3,可得到3棵子树,其子树的节点数量依次为2、3、5,最大为5。 枚举所有节点,计算删除每一个节点后所有子树中的最大节点数量。...在一棵树上添加或删除一个叶子,那么它的重心最多只移动一条边的距离。 查找树重心的算法思想: 直观来讲,删除一节点后,计算所有子树的最大。但是,具体如何实施?...如果需要求出一条直径上所有的节点,则可以在第二次 DFS 的过程中,记录每个点的前序节点,即可从直径的一端一路向前,遍历直径上所有的节点。

15210

C++中map和set的使用

set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。 set在底层是用二叉搜索树(红黑树)实现的。...erase 删除指定位置的数据(可以提供迭代器,也可以是元素) void swap (set& x); 交换两个set void clear(); 清除set中的数据 (3)查找 接口名 解释 iterator...它是按照键(key)进行排序和存储的,键必须是唯一的,而(value)可以重复。map通常使用红黑树实现,所以它的查找、插入和删除操作的时间复杂度都是O(log n)。 那么何为键值对?...::cout << my_map["apple"] << std::endl; // 输出 2 std::cout << my_map["pear"] << std::endl; // 输出默认...由于不区分大小写,可以先将字符串中所有的字母转化为小写。 将字符串按照空格划分,划分为一个个单词word。 将单词存入map,没出现一次单词,该单词的次数就+1; 最后按迭代器跑一遍即可。

19110

这些年我在实践中学到的编程知识

有的时候写不难,测很难,因为我们没法覆盖所有的测试用例。构造测试用例主要面对两类问题:“我不知道我不知道”以及“我知道但无法构造”。 我不知道我不知道 我们无法构造视野之外的测试用例。...但这个问题无法得到根本解决,特别是系统在经过逻辑变动、数据迁移等改动,可能所有人都认为测试已包含所有场景,系统也在正常运行,结果某天拿出数据一看,发现有的数据是错误的。...我知道但无法构造 网和测试环境的不同,就导致必定有无法构造测试用例的场景。例如二者的机型、数据、量级等。...从数据层面看,例如配置,测试环境和网就是不一样,如果网配置写错了也只能通过发现网异常再修改。...在很久之前,我和同事们讨论过一个问题:如果Web层校验了参数,那么应用层、领域层以及还再次校验?如果需要校验,相同的校验规则如果改变,那么就要改几个地方,维护成本会变高。

13110

真没想到nullptr和NULL得区别,大了去了

// 使用小括号还是大括号,造成结果大相径庭的一个例子是:使用两个实参来创建一个 std: : vector对象 。...//引用C++11 中的 std::tuple型别的各个阈时,假设为一个社交网站准备一个元组来持有名字,电子邮件和声望 using UserInfo = std::tuple<std::string,...条款11:优先选用删除函数,而非private未定义函数 //宗旨:阻止调用函数得方法:函数未经声明,不可调用 //删除函数得优点1: //删除函数无法通过任何方法使用,所以即使成员和友元函数中得代码也因试图复制...if(isLucky(true))//错误 if(isLucky(3.5f))//错误 //优点3:删除函数可以阻止那些不应该进行得模板具,private成员函数做不到 //假设需要一个和内建指针协作得模板...• 任何函数都可以删除,包括非成员函数和模板具

1.7K30

为啥有时迭代器用一下它就需要更新一下呢(迭代器失效)?

1、删除  erase 注:尾删是一种 删除 中最特殊情况之一,为方便解释失效原理所以选择的,下文引申到其它情况。且容器使用的为vector,其它容器可以类比。...v.erase(it); } //尾删后,能读写?...哦,真的这么简单?    那位为啥在vs2013中只存在要删除了迭代器就会失效这种判定呢?         ...,所以不仅为了平台的可移植性还为了代码的完美,我们就要认定只要删除了节点迭代器就失效了 注:在不更新迭代器情况下,任意删除除了尾删一定出错,也有其它的场景会得不到预期的结果 例如:1 2 2 5 vector...,这个返回就是我们来更新旧迭代器的。

24220

日更系列:使用函数指针的小伎俩

C语言标准规定,函数指示符(function designator,即函数名字)既不是左,也不是右。但C++语言标准规定函数指示符属于左,因此函数指示符转换为函数指针的右属于左转换为右。...这个接口函数可以是普通函数,类的静态函数,类的成员函数可以? 三、使用类的成员函数作为函数指针可以 再来看一个例子: 我们有1个接口类,和个实现接口类的实现类。...然后呢,我们对他操作manipulate,这个操作遍历所有的实现类,并以此调用每个类实现的接口。...然后在do里面另分出一个truncate函数,然后把truncated_calculator_vec->IsTrancated传递过去,这样是否可行,能这样写?...truncated_calculator_vec->IsTruncated(item); foo(truncated_calculator_vec->IsTruncated, item);//可以这样写

70360

学过 C++ 的你,不得不知的这 10 条细节!

有的编译器,运用了此 PI 常量,如果遇到了编译错误,那么这个错误信息也许提到 3.14 而不是 PI,这就会让人困惑哪里来的3.14,特别是在项目大的情况下。...说明「按传递」,在进入函数时,产生一个副本,离开作用域后就会消耗,说明这里是存在开销的。...那么可能在读取未初始化的导致不明确的行为。 为了避免不确定的问题,最佳的处理方法就是:永远在使用对象之前将它初始化。...T m_Id; // const }; 考虑下面会发生什么: std::string name1("小美"); std::string name2("小林"); Student p(name1...赋值之后 p.m_Name 应该指向 s.m_Name 所指的那个 string ?也就是说引用自身可被改动?如果是,那就开辟了新天地,因为 C++ 并不允许「让引用更改指向不同对象」。

70720

golang的并发机制

那么当前golang能做到更好的并发,对比c提升了多少,以及做到更高效率的背后真相是什么?本文一一用案板的事实分析出来。...一、并发性能极限 1.1 每秒创建的上限 比如关心固定时间内可以创建的并发条目是多少,以大数定律,创建较多的数量,总的创建时间/线程数即是每个线程的时间。...另外知道多线程是共享内存地址空间,每个线程的栈大小2M,可以更改默认。所以系统所能同时拥有的线程数量是受内存限制的。...golang的轻:一个新创建的goroutine赋予了几千字节,不运行,go自动缩减内存。每个函数调用相当于3个cpu指令。如果goroutine是线程,资源消耗更小。...那如果就访问到那些不存在的地址空间怎么办,golang会把内存移到堆(是,其实程序跑起来 地址是没变的)。

1.7K11

C++后台研发工程师2018年BAT华为网易等面经总结

目前提前批和内推已经基本结束,有意向的offer也有了几个,整理下C++后台的面经(包括春季实习招聘)合集回馈各位牛友。...JAVA(不会你别问)  数据库用过哪些(没用过你别问),数据库的索引介绍一下(。。。) ...单链表翻转,如果只用指针的话怎么翻转  找100亿个数中最小的1000个数  二面:  扣简历项目细节  JAVA(真的不会)  那问点C++吧:多态如何实现、auto如何实现、编译器对extern...手写个双向链表,带插入删除等功能  bitmap用过,介绍一下可以使用在什么场景  实习答辩面:  介绍实习做的东西  进程通信-共享内存怎么用  实现无锁循环队列的基础是什么  DDR4 2400MHZ...虚函数和多态如何实现的  static函数能定义成虚函数  shared_pointer了解,weak_pointer有什么作用  std::move有什么用,介绍下左和右  Const的用法

1K30

Modern C++ 最核心的变化是什么?

这种机制必须以一种最低开销的方式实现,并且对所有的类都有效。C++ 的设计者们注意到,大多数情况下,右所包含的对象都是可以安全的被移动的。...右(相对应的还有左)是从 C 语言设计时就有的概念,但因为其如此基础,也是一个最常被忽略的概念。不严格的来说,左对应变量的存储位置,而右对应变量的本身。...被移走资源的右在废弃时已经成为空壳,析构的开销也降低。 右中的数据可以被安全移走这一特性使得右被用来表达移动语义。以同类型的右构造对象时,需要以引用形式传入参数。...尽管 ``v是左,仍然优先采用移动语义,返回 vector` 从此变得云淡风轻。此外,无论移动或是拷贝,可能的情况下仍然适用编译器优化,但语义不受影响。...5.std::vector 的增长 又一个隐蔽的优化。当 vector 的存储容量需要增长时,通常会重新申请一块内存,并把原来的内容一个个复制过去并删除。对,复制并删除,改用移动就够了。

95921

【Linux】进程间通信上 (1.5万字详解)

但是父子进程共用一个文件描述符数组? 不会,因为父子进程可能会打开不同的文件,为了确保独立性,并让父进程可以操作文件,操作系统会为子进程创建一个独立的文件描述符数组。...我问:假如张三定的是6号包间,李四问张三为什么要定6号包间? 不会,因为数字的作用仅仅是用来标识这个房间的唯一性,数值毫无意义。 我们提到每一个共享内存都有相应的数据块用来保存这个内存的属性信息。...等到再有进程拿着相同的key申请内存时,系统就会遍历系统内所有的共享内存的数据块,然后将自己的key和数据块中的key进行对比。...: // ipcShmServer 服务端代码, 即 接收端 // 需要创建、删除共享内存块 // 需要创建、删除命名管道 #include "common.hpp" using std::cout;...: // ipcShmClient 客户端代码, 即 发送端 // 不参与共享内存块的创建与删除 // 不参与命名管道的创建与删除 #include "common.hpp" using std::cout

8510
领券