
C++ 服务器编程
文章平均质量分 85
mo4776
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
boost中的指针容器
boost中的指针容器基本概念在C++中用容器来管理动态分配的内存,首先想到是会通过标准容器来存储boost::shared_ptr,如下代码:#include <boost/shared_ptr.hpp> #include <vector> int main()原创 2018-02-27 14:23:45 · 1204 阅读 · 0 评论 -
shared_ptr应用细节
shared_ptr应用细节boost与C++11中shared_ptr对数组支持的区别shared_ptr< void > 万能指针shared_ptr线程安全借助shared_ptr来实现多线程中的”写时复制”shared_ptr应用细节boost与C++11中shared_ptr对数组支持的区别boost中的shared_ptr支持...原创 2018-03-18 22:39:21 · 630 阅读 · 0 评论 -
再识关联容器
关联容器包括set,multiset,map,mulitmap,它们的实现通常是平衡二叉树。下面是记录关联容器的一些使用细节。特有查找接口根据关联容器的实现的数据结构平衡二叉树。它们提供了查找接口。名称作用find(elem)返回“元素为elem“的一个元素,如果找不到就返回end()lower_bound(elem)返回elem的第一个可安插位置,也就是“元素值>=elem“的第一个元素位置upper_bound(elem)返回elem的最后一个可安插位置原创 2021-05-04 21:09:12 · 133 阅读 · 0 评论 -
使用C++ 11 chrono库处理时间
跨平台时间处理对于时间处理的需求获取当前时间,比如记录日志,精度一般到毫秒计算时间间隔,比如判断代码块的运行时长获取日期,日期换算定时器OS提供的API时间日期相关time_t time() //返回从1970-01-01 00:00:00 +0000 (UTC)的秒数(C语言标准库提供)int gettimeofday(struct timeval *tv, struct timezone *tz); //返回指定时区 回从1970-01-01 00:00:00 +0000 (原创 2021-08-21 10:04:20 · 5190 阅读 · 1 评论 -
手把手教你实现buffer(一) —— C++中buffer的概念及需求
buffer的概念很庞大,根据不同场景,有各种各样功能的buffer,比如双缓冲buffer,jitterbuffer。这篇文章说的buffer,是指一段用于存取数据的内存空间,这是最基础的buffer。然而就是这种最基础的buffer,在C++中标准库也没有提供很通用,完善的buffer类(-_-!)。这一系列文章,将参照webrtc中的,一步步介绍如何实现这样的buffer。......原创 2022-08-01 18:55:15 · 9374 阅读 · 0 评论 -
手把手教你实现buffer(三)——接口及自动扩容
但是buffer还是有特定的使用场景,也需要一些基本的,通用的,易用的接口。的中内容,就需要提供这样的接口,所以使用时一点要注意不要破坏内存,比如写了大于容量的数据量等。定义在buffer.h文件中,在前一篇文章已经贴出,下面是buffer.cpp的代码。内容管理机制的接口,可以直接往内存中读写数据,权限太大。写入数据时,如果当前的容量不够,则会再次分配内存,扩大容量。重载了两种不同形式的下标操作符,前面一个是返回。位置的引用,可以直接更改数据。内部内存的地址,并且可以直接读写数据。指针,只可读,不可写。.原创 2022-08-08 09:33:24 · 1116 阅读 · 0 评论 -
C++ 11 多线程编程(二)--更高层次的抽象
文章目录线程协作的更高层次的抽象std::futurestd::promise用法建立”通道“使用“通道”协作流程图代码示例std::packaged_taskstd::future与std::shared_futurestd::future 与 std::promise还有更高层次的抽象```std::async```小结线程协作的更高层次的抽象std::thread库对OS 线程系列API的封装,可以非常方便地使用线程,互斥量,条件变量。但是直接使用std::thread库中的互斥量,条件变量来实现原创 2021-07-14 09:57:01 · 331 阅读 · 2 评论 -
lambda函数用法总结
概念lambda函数是C++ 11引入的新特性,在其它语言中也有lambda,典型的如javascript。它是函数编程的基础。在C++中,lambda表示匿名函数,特点是就地定义就地使用,它是一种语法糖,编译器会将它翻译成函数对象。所以它并不是一个"黑科技"。C ++ 11引入lambda表达式的目的就是要就地书写,就地使用,提供一种简化代码的手段。所以咱们主要是了解它的使用。基础用法语法捕捉列表+参数列+函数体1.[ 捕获 ] ( 形参 ) -> ret { 函数体 }2.[ 捕获原创 2021-05-28 10:15:09 · 3035 阅读 · 1 评论 -
C++ 11多线程编程(三)--生产者消费者队列及实现
文章目录生产者消费者队列用途划分:容量划分:实现有界队列无界队列生产者消费者队列它是实现线程间协作,交互一种重要手段。从一端放数据,从另一端取数据。放入数据的线程称为生产者,取出数据的线程称为消费者。生产者和消费者可以有一个或多个。生产者,消费者线程间通过条件变量来实现协作对队列的访问需要加锁互斥用途划分:根据队列的用途来划分为两大类数据分发队列中存放的业务数据。分别有一个或多个生产者,消费者线程。生产者线程产生不同类型的数据,通过队列分发给不同消费者线程任务队列队列原创 2021-08-05 09:41:15 · 5563 阅读 · 1 评论 -
说说C++中的POD
背景POD的全称是Plain Old Data,这个Old就是体现了C语言的兼容。POD数据类型就是兼容性很重要的体现,特别是对用户自定义的类型(struct,class定义的类)。因为标准要求POD类型的内存布局是完全与C语言。原理C++是C的超集,加入了更多语法层面的新机制,编译器充当了一个翻译的角色struct POD{ int v; int a;};struct NotPOD{ public: NotPOD(){}原创 2020-05-22 16:16:30 · 1255 阅读 · 0 评论 -
bind和function
文章目录概述可调用对象可调用对象的类型调用形式function的用法bind的用法function与bind结合新的回调实现机制面向对象的思想通过回调实现概述bind和function是C ++ 11引入的非常重要的两个语言特性,通过它们C++也可以很方便的实现类似C#的中委托,从而提供了一种新的回调实现机制。先看下它们的用法。可调用对象在C++中函数,函数指针,指向类的成员函数指针,函数对象(重载了调用运算符的类),lambda函数int func(int a,int b){ r原创 2021-05-15 10:37:47 · 1281 阅读 · 2 评论 -
手把手教你实现buffer(二)——内存管理及移动语义
禁止拷贝,通过是构造函数,复制构造函数,赋值操作符号来实现。类,它是一个非常典型的基础buffer封装,我们来通过分析它的实现,来学习要如何实现一个buffer。多引用几次,引用关系就会混乱了,很容易造成问题,比如内存无法释放;在C++中最直观的语义就是引用语义,因为它代表一块内存空间。但是这种引用语义,很难区分所有权,即是谁需要对这块内存负责(负责分配,负责释放),这种语义的。移动赋值运算符的逻辑跟移动构造函数的相同,将资源转移,将原对象置为无效。给到了所构造的对象,而原对象的。时,内存会自动释放。...原创 2022-08-01 18:57:19 · 1250 阅读 · 0 评论 -
手把手教你实现buffer(四)——webrtc中的CopyOnWriteBuffer
的实现基于Buffer,在功能上强于Buffer。我们也可以根据业务的需求,基于Buffer封装自己的Buffer类。原创 2022-11-02 10:07:50 · 652 阅读 · 0 评论 -
boost circular_buffer的特性及应用
boost circular_buffer的特性及应用boost circular_buffer的应用circular_buffer实现的有界队列(消费生产者队列)circular_buffer在音视频系统中的应用用于实现采集线程与编码线程间的队列用于实现解码线程与渲染线程间的队列boost circular_buffer的特性及应用boost库中的c...原创 2018-03-13 17:52:13 · 4956 阅读 · 2 评论 -
C++ 11 多线程编程(一)
文章目录基本概念多线程编程的层次线程库STL中thread库线程的创建线程的生命周期线程对象不支持复制和赋值,只支持移动语义将线程移动到容器中线程间的通信临界区互斥量条件变量错过信号及假醒条件变量的使用规则基本概念并发:让实际可能串行发生的事情好像同时发生一样。并行:并发序列同时执行,真正的并行只能在多核系统中存在。并行要求程序能够同时执行多个操作,而并发只要求程序能够假装同时执行多个操作((在单核下,通过os的调度实现并发,多核下会分配到不同的核去处理))用一个典型的例子来说明并发与并行:1原创 2021-07-03 11:21:37 · 644 阅读 · 7 评论 -
cmake 资料整理
记录了一些cmake的资料,以下资料都是链接,直接点击即可。cmake入门cmake中预定义变量文档cmake中 configure_file函数的用法通过cmake判断g++编译器是否支持C ++11如何使cmake生成debug和release的编译脚本如何方便的清理cmake命令产生的cache及日志文件...原创 2019-01-04 11:06:14 · 445 阅读 · 0 评论 -
C++ 11中的移动语义
移动语义文章目录移动语义拷贝与移动拷贝移动左值与右值左值引用和右值引用移动语义移动构造函数和移动赋值函数移动对象后为可析构状态编译器生成移动操作移动操作的匹配std::move函数STL中的移动语义拷贝与移动一个形象的比喻如何把一个冰箱里的大象放到另一个冰箱中?打开冰箱1的门,打开冰箱2的门,将冰箱1里的大象移动冰箱2中,关上冰箱门。这是一个很自然的方法,那么还有一种方法,将冰箱2里的大象复制一头,将复制的大象放到冰箱1中,再让冰箱2里的大象消失掉。这种方法是不是感觉似曾相识,这个就是C ++原创 2021-09-15 10:06:54 · 503 阅读 · 0 评论 -
将自定义类型作为关联容器的key
如下一个结构体structS{intn;boolf;floatd;};作为关联容器的key,需要定义operator原创 2022-07-26 10:12:52 · 209 阅读 · 0 评论 -
线程本地存储 TLS
线程本地存储 TLS(静态TLS)TLS的概念,以下链接讲的比较详细静态TLSTLS的应用总结线程本地存储 TLS(静态TLS)TLS的概念,以下链接讲的比较详细聊聊Linux中的线程本地存储(1)——什么是TLS 静态TLS上面链接中提到__thread关键字是GCC编译器的扩展,并不属于标准,所以在window下的VC++是没有这...原创 2018-02-27 14:22:14 · 501 阅读 · 0 评论 -
实现一个简单的基于asio的定时器
定时器的精度为秒级,代码如下:timer.h #ifndef ASIO_TIMER_H#define ASIO_TIMER_H#include <map>#include <vector>#include <mutex>#include <boost/asio/io_service.hpp>#include <boos...原创 2018-01-22 17:29:17 · 1009 阅读 · 0 评论 -
asio中的buffer
异步操作基本特征异步操作的特点就是,操作不会被阻塞,马上返回,操作结果会通过回调函数告知。在asio中的异步IO也是如此,我们来看一个asio中udp socket的异步sendto接口,如下代码dpSocket.async_send_to(buffers, boost::asio::ip::udp::endpoint(destination.getAddress(), ...原创 2019-05-12 18:31:57 · 4299 阅读 · 0 评论 -
说一说asio中两个需要注意的错误码
背景在我们的媒体库中使用基于asio封装一套IO模块,主要功能是媒体流的收发及转发。我们的系统使用的RTP协议作为流媒体协议,所以传输层协议是基于udp协议。问题1在sip信令协商成功后,开始流媒体收发时,偶现在异步收接口中一直报10061错误码,对应的错误码描述是连接被拒绝出现这个错误,感觉很奇怪,媒体流的收发都是基于udp的,为什么会报连接被拒绝,又不是基于tcp的。检视代码未发现逻辑...原创 2019-09-19 20:32:45 · 1205 阅读 · 0 评论 -
你了解linxu下的线程id吗?
背景最近在实现一个日志库时,需要记录线程id,我采用C++ 11中的std::thread api获取,如下例子代码:#include <thread>#include <iostream>int main(){ std::thread::id tid = std::this_thread::get_id(); std::cout <<...原创 2019-08-13 11:10:34 · 455 阅读 · 0 评论 -
掌握几种linux工具让程序更稳定
总结几种linux下观察程序使用资源情况的工具,包括:CPU,内存,fd有无泄漏,IO有无异常(比如日志异常输出),网络IO有无异常。通过这几种工具监控程序运行时资源有无异常,让程序更加稳定。CPU使用率最常用的命令是top,它可以显示整个系统中所有进程的CPU使用情况并且可以进行排序,当然它不止可以监控CPU资源,还可以监控内存,IO等。默认以CPU的使用率排序。最简单的方式就是直接输入...原创 2019-07-08 11:49:14 · 678 阅读 · 0 评论 -
boost asio处理tcp和udp的不同之处及要点
最近在看asio,打算基于asio重构媒体服务器中网络模块,学习的过程注意到了在udp和tcp中,对asio使用的所应该注意的地方,现记录下来 tcp与udp的不同之处 老生常谈的tcp与udp最大的不同是,tcp是可靠的并且保证数据到达。udp是不可靠的,通俗的描述就是它只管发,至于对方是否收到数据,一概不负责。所以在处理tcp和udp上的读写操作就有...原创 2017-12-15 11:43:29 · 1795 阅读 · 0 评论 -
boost asio的基本知识点
socket编程的基本步骤socket编程的基本步骤罗列如下,只是列出一个基本流程,不涉及到错误处理,io操作的方式。万变不离其宗,asio中的最基本步骤也是如此,它对基本的socket api进行了封装。UDP服务端流程创建socketbind ip地址和端口io操作(recvfrom或sendto)客户端流程创建socketconnect操作(可选)io操作(recv...原创 2019-03-08 09:46:49 · 595 阅读 · 0 评论 -
io_service对象的线程模型
io_service对象的线程模型体现在对io_service对象的run方法调用形式,不同的调用形式,会影响io_service post和dispatch方法对任务的分发方式。一个io_service对象,一个线程调用该对象的run方法#include <iostream>#include <thread>#include "boost/asio.hpp"...原创 2019-03-15 00:23:20 · 1458 阅读 · 0 评论