c++
文章平均质量分 88
chansoncc
从事嵌入式软件开发,网络开发。
展开
-
C++智能指针原理
在C++11中,引入了智能指针。主要有:unique_ptr, shared_ptr, weak_ptr。这3种指针组件就是采用了boost里的智能指针方案。很多有用过boost智能指针的朋友,很容易地就能发现它们之间的关系:stdboost功能说明unique_ptrscoped_ptr独占指针对象,并保证指针所指对象生命周期与其一致shared_ptrshared_ptr可共享指针对象,可以赋...原创 2018-07-10 14:48:07 · 1302 阅读 · 0 评论 -
WebSocket原理与实践(三)--解析数据帧
1-1 理解数据帧的含义: 在WebSocket协议中,数据是通过帧序列来传输的。为了数据安全原因,客户端必须掩码(mask)它发送到服务器的所有帧,当它收到一个没有掩码的帧时,服务器必须关闭连接。不过服务器端给客户端发送的所有帧都不是掩码的,如果客户端检测到掩码的帧时,也一样必须关闭连接。当帧被关闭的时候,可能发送状态码1002(协议错误)。基本帧协议如下: 0 ...转载 2018-11-02 15:43:08 · 654 阅读 · 0 评论 -
WebSocket原理与实践(四)--生成数据帧
从服务器发往客户端的数据也是同样的数据帧,但是从服务器发送到客户端的数据帧不需要掩码的。我们自己需要去生成数据帧,解析数据帧的时候我们需要分片。消息分片: 有时候数据需要分成多个数据包发送,需要使用到分片,也就是说多个数据帧来传输一个数据。比如将大数据分成多个数据包传输,分片的目的是允许发送未知长度的消息。这样做的好处是: 1. 大数据的传输可以分片传输,不用考虑到数据大小导致的长度...转载 2018-11-02 15:44:54 · 221 阅读 · 0 评论 -
理解WebSocket心跳及重连机制(五)
在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件。这样会有:服务器会继续向客户端发送多余的链接,并且这些数据还会丢失。所以就需要一种机制来检测客户端和服务端是否处于正常的链接状态。因此就有了websocket的心跳了。还有心跳,说明还活着,没有心跳说明已经挂掉了。1. 为什么叫心跳包呢?它就像心跳一样每隔固定的时间发一次...转载 2018-11-02 15:46:24 · 708 阅读 · 0 评论 -
WebSocket协议解析
一、协议简介WebSocket protocol 是HTML5一种新的协议,它是实现了浏览器与服务器全双工通信,本文主要介绍WebSocket协议格式。WebSocket通信过程分为两步:握手请求和数据传输。二、握手请求1、客户端在连接请求时候发送的内容GET / HTTP/1.1Connection:UpgradeHost:127.0.0.1:8088Origin:nu...转载 2018-11-02 15:32:26 · 353 阅读 · 0 评论 -
WebSocket原理与实践(一)---基本原理
一:为什么要使用WebSocket?1. 了解现有的HTTP的架构模式:Http是客户端/服务器模式中请求-响应所用的协议,在这种模式中,客户端(一般是web浏览器)向服务器提交HTTP请求,服务器响应请求的资源(例如HTML页面)和关于页面的附加信息。1-1. HTTP的特点是:HTTP是半双工协议,也就是说,在同一时刻流量只能单向流动,客户端向服务器发送请求(单向的),然后服务器响应...转载 2018-11-02 15:35:12 · 154 阅读 · 0 评论 -
WebSockets通信
1. websocket是什么?WebSocket是一种网络通信协议。2. 为什么需要websocket?我们有http协议,为什么还需要websocket协议呢?因为http协议有一个缺陷,通信只能是客户端发起请求的,服务器端返回查询结果。比如说 我想知道一个实时新闻,那么每次新闻更新后,我都要刷新页面,发起客户端请求,服务器端返回结果。不能做到服务器端推送消息给客户端,当然我们可以使用...转载 2018-11-02 15:38:02 · 7492 阅读 · 1 评论 -
无锁同步-C++11之Atomic和CAS;如何理解C ++ 11中的std :: atomic :: compare_exchange_weak
1、概要 本文是无锁同步系列文章的第一篇,主要探讨C++11中的Atomic。 我们知道在C++11中引入了mutex和方便优雅的lock_guard。但是有时候我们想要的是性能更高的无锁实现,下面我们来讨论C++11中新增的原子操作类Atomic,我们可以利用它巧妙地实现无锁同步。2、传统的线程同步 #include <thread>#i...转载 2018-12-05 16:35:14 · 5027 阅读 · 1 评论 -
C++ 11 Lambda表达式
C++ 11 Lambda表达式C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等。今天,我们就来简单介绍一下C++中Lambda表达式的简单使用。声明Lambda...转载 2018-12-06 16:14:00 · 118 阅读 · 0 评论 -
C++11 CAS无锁函数compare_exchange_weak的使用
对compare_exchange_weak这个C++11用来实现CAS无锁算法函数的理解。可以先看一下cplusplus给出的用这个函数实现无锁链表的例子:// atomic::compare_exchange_weak example:#include <iostream> // std::cout#include <atomic> ...转载 2018-12-18 15:42:28 · 9070 阅读 · 3 评论 -
利用C++11原子量atomic实现自旋锁详解
一、自旋锁自旋锁是一种基础的同步原语,用于保障对共享数据的互斥访问。与互斥锁的相比,在获取锁失败的时候不会使得线程阻塞而是一直自旋尝试获取锁。当线程等待自旋锁的时候,CPU不能做其他事情,而是一直处于轮询忙等的状态。自旋锁主要适用于被持有时间短,线程不希望在重新调度上花过多时间的情况。实际上许多其他类型的锁在底层使用了自旋锁实现,例如多数互斥锁在试图获取锁的时候会先自旋一小段时间,然后才会休眠...转载 2018-12-18 15:48:54 · 3524 阅读 · 0 评论 -
C++11的原子量与内存序浅析
C++11的原子量与内存序浅析一、多线程下共享变量的问题在多线程编程中经常需要在不同线程之间共享一些变量,然而对于共享变量操作却经常造成一些莫名奇妙的错误,除非老老实实加锁对访问保护,否则经常出现一些(看起来)匪夷所思的情况。比如下面便是两种比较“喜闻乐见”的情况。(a) i++问题在多线程编程中,最常拿来举例的问题便是著名的i++ 问题,即:多个线程对同一个共享变量i执行i++ ...转载 2019-03-05 16:05:57 · 307 阅读 · 0 评论 -
WebSocket原理与实践(二)---WebSocket协议
WebSocket协议是为了解决web即时应用中服务器与客户端浏览器全双工通信问题而设计的。协议定义ws和wss协议,分别为普通请求和基于SSL的安全传输, ws端口是80,wss的端口为443.WebSocket协议由两部分组成,握手和数据传输。2-1 握手WS的握手使用HTTP来实现的。客户端的握手消息是一个普通的,带有Upgrade头的,HTTP Request的消息。先来看看如...转载 2018-11-02 15:41:52 · 225 阅读 · 0 评论 -
信号量 互斥锁 条件变量的区别
信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里)。而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。有的时候锁和信号量会同时使用的”也就是说,信号量不一...转载 2018-10-17 16:56:21 · 194 阅读 · 0 评论 -
weak_ptr这个智能指针有什么用?
转自: https://segmentfault.com/q/1010000004078858c++primer:通过使用weak_ptr,不会影响一个给定的strblob所指向的vector的生存期。但是,可以阻止用户访问一个不再存在的vector的企图。书上说的作用就这一个,我想不通的是,阻止用户访问一个不再存在的vector,难道就不能通过检测strblob的shared_p...转载 2018-10-19 15:57:52 · 2406 阅读 · 0 评论 -
C++ explicit关键字详解
首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子:class CxString // 没有使用explicit关键字的类声明, 即默认...转载 2018-07-10 14:50:23 · 384 阅读 · 0 评论 -
c++智能指针
c++智能指针1.应用与原理 智能指针和普通指针的区别在于智能指针实际上是对普通指针加了一层封装机制,这样的一层封装机制的目的是为了使得智能指针可以方便的管理一个对象的生命期。c++通过new和delete来处理动态内存的申请和释放,但是new之后处理不好delete便会导致内存泄漏。但是智能指针的删除是智能指针本身决定的,用户不需要管理释放。 智能指针的封装是一个模板,所以使用的方式是sha...转载 2018-07-10 16:14:05 · 180 阅读 · 0 评论 -
c++仿函数 functor
内容整理自国外C++教材 先考虑一个简单的例子:假设有一个vector<string>,你的任务是统计长度小于5的string的个数,如果使用count_if函数的话,你的代码可能长成这样:1 bool LengthIsLessThanFive(const string& str) {2 return str.length()<5; 3 }...转载 2018-08-15 15:33:03 · 129 阅读 · 0 评论 -
c++ Lambda函数
或许,Lambda 表达式算得上是 C++ 11 新增特性中最激动人心的一个。这个全新的特性听起来很深奥,但却是很多其他语言早已提供(比如 C#)或者即将提供(比如 Java)的。简而言之,Lambda 表达式就是用于创建匿名函数的。GCC 4.5.x 和 Microsoft Visual Studio 早已提供了对 lambda 表达式的支持。在 GCC 4.7 中,默认是不开启 C++ 11 ...转载 2018-08-15 17:31:01 · 871 阅读 · 0 评论 -
C++ foreach & boost::lexical_cast
C++ foreach考虑下面的需求,对vector<int>中的每个元素加1,如何做? void add(int& lhs) // 注意:要修改主调方法中的数据,这里要使用引用{ lhs= lhs + 1;}int intArray[] = {1,2,3,4,5};vector<int> intVector(intArray,intAr...转载 2018-08-31 17:27:59 · 152 阅读 · 0 评论 -
c++ std::bind 详解及参数解析
// Bind_std_function.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <functional>#include <random>#include <memory>//学习bind的用法void f(int n1, int n...转载 2018-08-30 15:39:06 · 3842 阅读 · 0 评论 -
C++中的RAII介绍
C++中的RAII介绍摘要RAII技术被认为是C++中管理资源的最佳方法,进一步引申,使用RAII技术也可以实现安全、简洁的状态管理,编写出优雅的异常安全的代码。资源管理RAII是C++的发明者Bjarne Stroustrup提出的概念,RAII全称是“Resource Acquisition is Initialization”,直译过来是“资源获取即初始化”,也就是说在构造函...原创 2018-10-09 15:17:03 · 230 阅读 · 0 评论 -
C++11(及现代C++风格)和快速迭代式开发
过去的一年我在微软亚洲研究院做输入法,我们的产品叫“英库拼音输入法” (下载Beta版),如果你用过“英库词典”(现已更名为必应词典),应该知道“英库”这个名字(实际上我们的核心开发团队也有很大一部分来源于英库团队的老成员)。整个项目是微软亚洲研究院的自然语言处理组、互联网搜索与挖掘组和我们创新工程中心,以及微软中国Office商务软件部(MODC)多组合作的结果。至于我们的输入法有哪些创新的fe...转载 2018-10-09 15:19:19 · 227 阅读 · 0 评论 -
我用C++的理由——关于C和C++的选择
摘自:http://www.xue163.com/32/6/325715.html,作者:王可。整理的很好!首先,我不会使用Java或C#,能力上不会,主观上也不会,因为两点原因:1,他们都属于解释型的语言,这有很多问题是我无法容忍的,程序的速度和封装的安全性;2,他们都不够底层,没有指针,却加载了内存管理器,对我来说这些都是麻烦和束缚,对我而言他们都不是足够自由的语言。或者说,我无法接受他...转载 2018-10-09 15:22:07 · 522 阅读 · 0 评论 -
Shared_from_this 几个值得注意的地方
shared_from_this()是enable_shared_from_this<T>的成员 函数,返回shared_ptr<T>。首先需要注意的是,这个函数仅在shared_ptr<T>的构造函数被调用之后才能使 用。原因是enable_shared_from_this::weak_ptr并不在构造函数中设置,而是在shared_ptr<T>的...转载 2018-10-19 14:28:50 · 222 阅读 · 0 评论 -
C++ 11 创建和使用共享 weak_ptr
1、为什么需要weak_ptr?在正式介绍weak_ptr之前,我们先来回忆一下shared_ptr的一些知识。我们知道shared_ptr是采用引用计数的智能指针,多个shared_ptr实例可以指向同一个动态对象,并维护了一个共享的引用计数器。对于引用计数法实现的计数,总是避免不了循环引用(或环形引用)的问题,shared_ptr也不例外。我们先来看看下面这个例子:#include...转载 2018-10-19 15:25:02 · 151 阅读 · 0 评论 -
C++ 多态详解
前几天在网上看到这样的一个问题:多态现在一般的用法,就是拿一个父类的指针去调用子类中被重写的方法。但我搞不懂为什么要那么做,我们直接在子类中写一个同名的成员函数,从而隐藏父类的函数不就行了么?然后有人这样回答:将父类比喻为电脑的外设接口,子类比喻为外设,现在我有移动硬盘、U盘以及MP3,它们3个都是可以作为存储但是也各不相同。如果我在写驱动的时候,我用个父类表示外设接口,然后在子类中重...转载 2019-03-05 16:09:22 · 327 阅读 · 0 评论