[c++实践]01-参数解析
本文为c++98之后的c++特性/库相关文章的索引汇总,持续更新.........c++11系列[c++11新特性]01-统一初始化列表[c++11新特性]02-自动类型推导[c++11新特性]03-构造函数新特性与新的关键字[c++11新特性]04-函数式编成:lambda,function,bind[c++11新特性]05-右值引用和完美转发[c++
数据结构与算法[数据结构]跳表典型算法题[典型]387. 字符串中的第一个唯一字符-简单 [典型]BM74 数字字符串转化成IP地址-中等[典型-动态规划]BM70 兑换零钱(一)-中等[典型]BM55 没有重复项数字的全排列-中等[典型]BM56 有重复项数字的全排列-中等 [典型-贪心]BM96 主持人调度(二)-中等 [典型]BM5
你之所以这么晚不想睡,是因为没有结束今天,面对明天的勇气。1.坚持学习、写博客——所有不做记录的读书学习都是不负责任的2.切勿浮沙筑高台3.简单生活、轻装上阵、运动的人最美丽4.见心明性,相由心生 做C++已经2年了,在开年前的3个月,将这两年看过的书,使用过的东西,开个博客记录下,作为两年的一个总结,也作为新旅程的开始。最近听老大说,公司的C++测试工具平台要开始
可以使用chrt命令设置进程的调度策略和优先级。以下命令将11528进程的调度策略设置为RR,调度优先级设置为20: chrt -r --pid 20 11528 具体使用见其help信息,如下: ighthouse@cpp_template$ chrt --help Show or change the real-time scheduling attributes of a process.
systemctl简单命令systemctl start xxx systemctl stop xxx systemctl enable xxx # 查看服务状态 systemctl status xxx journalctl --unit xxx # 输出启动时序 systemd-analyze plot > plog.svg
[c++实践]关于标准库中字符串的高效处理 无论什么程序,都需要大量的使用字符串,c++标准库提供了 std::string 对字符串进行处理。熟悉 std::string 实现逻辑的都知道,std::string 库比较耗时的操作主要在内存的分配与字符串的拼接。因为内存分配实际上还是使用的 malloc ,但是在多线程环境下调用该函数会有一个全局的锁,如果频繁的调用该函数会导致性能的严重下降。而
[FASTDDS]05-DDS库总览 架构 应用层:用户应用通过fast dds的API实现分布式系统通信 Fast DDS 层:DDS通信中间件的实现。它允许部署一个或多个DDS域,同一域内的DomainParticipants通过在Domain中的topic来发布/订阅来交换消息。 RTPS 层:实现实时发布-订阅(RTPS)协议,以实现与DDS应用程序的互操作性。该层充当传输层的抽象层。
[FASTDDS]04-hello_fastdds程序分解 在之前的章节我们介绍了如何搭建fastdds编译环境,以及使用fastgen生成demo代码。这里我们将在前面的基础上,参考fastdds官方的另外一份 Writing a simple C++ publisher and subscriber application,来对fastdds的发布者和订阅者代码进行分解。 生成工程代码 我
hello-world-fastdds 本章我们运行第一个fastdds示例——hello-world-fastdds。步骤如下: 创建消息.IDL文件 使用fastddsgen生成消息对应的源文件 编译、运行示例 创建消息文件 //hello_fastdds.IDL struct hello_world { string name; int counter; }; 生成消息
# 查看cpu的信息 lscpu cat /proc/cpuinfo # 运行时绑定CPU taskset -c 2,3,5 ./cpuloading 5 2 1000 # 查看进程绑定的cpu $ ps -fe | grep cpuloading uidq8207 11910 23209 2 13:20 pts/234 00:00:00 ./cpuloading 5 2 1000 $ t
关于模板函数只能在头文件中实现这件事 最近在实现一个序列化功能,大致如下: // seialize.h #pragma once #include <vector> #include <type_traits> class Serializer { public: template <typename T, typename = typename std::e
增加cpu loading 背景:在版本发布后需要在指定负载情况下测试程序性能 代码很简单,就是启动N个线程,每个线程做S次循环自增,然后再休眠U秒,如此往复。可以达到以模拟以下场景: 在空负载的情况下将单核或者多核的cpu loading增加到指定阈值 增加较多的线程数达到cpu上下文频繁切换的目的 代码 #include <chrono> #include
01-FastDDS简介 本节介绍DDS和RTPS的概念。 本文章来源于fast dds官网中的 What is DDS 和What is RTPS 章节 1.1 什么是DDS Data Disrubution Service(DDS)——数据分发服务——是一个用来进行分布式软件应用通信的协议。它描述了数据提供者和数据消费者之间的通信API以及通信语义。 DDS是一个以数据为中心的发布、订阅模
引用计数的实现 reference_object.cc 总结 引用计数可以减少对象的构造、析构的次数,一般用在一些开销比较大的对象上,或者需要对资源进行管理的对象上(比如套接字描述符被文件描述符) 如果是POD类型或者简单类型,不要使用引用计数,反而会降低效率 如果是要求线程安全的,则直接使用c++11提供的智能指针即可,除非是特别要求性能且不要求线程安全则可以实现自己的引用计数 引用计数设
posix_spawn通过一个指定的可执行文件创建子进程,并设置其启动参数和环境变量。其原型如下: #include <spawn.h> // pid:子进程的进程号 // path:创建子进程的可执行文件路径 // file_actions:与文件相关的操作 // attrp:进程属性 // argv:子进程的启动参数 // envp:子进程的环境变量 int posix_spaw
hello-world-fastdds 本章我们运行第一个fastdds示例——hello-world-fastdds。步骤如下: 创建消息.IDL文件 使用fastddsgen生成消息对应的源文件 编译、运行示例 创建消息文件 struct hello_world { string name; int counter; }; 生成消息对应的源文件 f
安装fast-gen fast-gen安装指引 fast-gen是一个java程序,因此需要安装openjdk和gradle。 export FAST_DDS_ROOT=/home/V01/uidq8207/work/code/third_party/Fast-DDS-GIT/ sudo apt install openjdk-8-jdk cd ${FAST_DDS_ROOT} git cl
Linux-X86 Fast-DDS-编译-部署-试运行 git地址 通信中间件 Fast DDS 基础概念简述与通信示例 fast-dds官网 fast-dds-Linux安装 必要工具安装和依赖库 # 安装工具 sudo apt install cmake g++ python3-pip wget git # 依赖库安装 sudo apt install libasio-dev lib
互斥锁的健壮性 互斥锁的健壮性,指的是当持有锁的线程/进程在未释放 锁的情况下退出时,可以通过其他操作将锁恢复到正常状态。可以通过设置锁的PTHREAD_MUTEX_ROBUST属性来达到该目的。 相关接口 #include <pthread.h> // __attr:互斥锁的属性 // __robustness:可取值PTHREAD_MUTEX_STALLED 或 PTHREA
需求产生的背景 在开发某通信应用时,由于某些原因,需要将接收的结构体A转换成另外一结构体B进行使用,其实它们是完全等价的。但在开发的过程中,由于A和B并不是来自于同一头文件,因此会存在潜在的结构体不一致的情况。为了避免这种潜在的错误导致的运行时错误,我们在收到结构体A的时候比较了A和B的大小,至少保证其大小一致,在进行内存操作时是安全的,其代码大致如下: void onRecvData(const
git 基础命令# 初始化仓库git init# clone 仓库git clone# 切换分支,使用-b选项将在当前分支的修改上创建新的分支git checkout [b]# 更新分支git pull# 添加修改到分支git add path# 添加提交注释git commit -m "a" -m "b" -m ...# 推送本次修改到分支git push origin dest# 查看或删除分
03disruptor的使用及缺陷disruptor的使用disruptor的使用代码可以见git仓库,这里仅仅对使用流程做一下简单介绍。消费者读数据消费者读数据的步骤如下:1.注册消费者,此时每个消费者会返回一个可读的消费者索引index_for_customer_use2.使用index_for_customer_use在共享内存环形队列上等待,直到该索引位置可读,将返回一个新的索引curso
环形队列这个环形队列的原理很简单,前面已经介绍过,再次进行简略说明:cap大小必须是2的N次方索引可以一直递增访问元素时索引需要对cap取模实现代码很简单,不再介绍。template<typename T>class RingBuffer{ public: RingBuffer() { capacity_ = D
disruptor详解disruptorCpp-IPCdisruptor原理使用循环队列,且要求队列大小为2的N次方,以满足位运算快速计算索引的要求(比取模速度快)使用原子变量记录生产者和消费者的个数,并且使用cache line进行隔离,避免多线程情况下由于两个变量处于同一cache line的伪共享问题无锁设计。通过原子变量,每个生产者和消费者都需要先申请数组中
目的:使用 pthread_mutex_t 和 pthread_cond_t 以及共享内存、内存映射 达到跨进程通信的目的步骤:通过 shm_open 、ftrancate、mmap将共享内存进行内存映射将 pthread_mutex_t 和 pthread_cond_t 保存在共享内存中,并且设置 PTHREAD_SHARED 属性,以达到跨进程使用的目的消费者在没有通知的情况下超时等待10s后
共享内存使用示例环境:ubuntu 18.04命令:ipcs(查看ipc信息)、ipcrm(删除指定ipc)、ipcmk(创建指定类型的ipc),可以通过--help查看帮助信息公共代码// sys.h#pragma once#include <stdlib.h>#include <unistd.h>#include <stdio.h>void exit
Linux共享内存API简介共享内存允许不同的进程共享一个给定的存储区,因为这些数据不需要在进程之间复制,所以这是最快的一种IPC。不同进程之间进行数据的读写也需要进行同步,通常可以使用信号量、互斥量进行同步。基本APIshmget在Linux环境中,对开始申请的共享内存空间进行了初始化,初始值为0x00。如果用shmget创建了一个新的消息队列对象时,则shmid_ds结构成员变量的值设置如下:
内存对齐与伪共享时间测试类该类会在后续的测试中用于运行时间测试。// public/timer.h#include <chrono>#include <iostream>#include <functional>struct ScopeTimer{ ScopeTimer(const char *msg):_msg(msg),_now(std::chrono
总结:在c++编程中,不建议使用异常。因为c++标准没有定义异常的实现方式,并且异常也不可以跨线程。构造函数异常构造函数可以抛出异常,此时对象还没有完全构造完成,对象的生命周期提前结束,不会调用对象的析构函数。禁止抛出异常在c++中,可以在函数的后面添加noexcept关键字来禁止函数抛出异常,如果该函数产生了异常,那么系统将中止该进程的执行。如果将一个显示抛出异常的函数声明为noex
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号