- 博客(1572)
- 资源 (33)
- 收藏
- 关注
原创 linux下给CPU增加指定百分比的压力
一台计算机会因为当前CPU的占率不同情况表现出不同的稳定性和实时性以及其他性能情况。需要编写一个程序将一个CPU或者多个CPU占用到指定值的占用率,比如50%。很多工具都是直接一颗CPU占满,意义不大。故此特地写一个代码。
2023-01-27 15:09:12
55
原创 apollo源码解读:信号槽机制
大家都知道Qt的信号槽机制给编程带来了极大的便利,阿波罗通讯主要通过同一channel的读写,简而言之就是发布订阅模型,这个时候信号槽的机制就显得极为实用,阿波罗在cyber基础类库里面用C++模板类自己写了一套信号槽机制,值的学习。1.和qt的信号槽差不多,不处理返回值,即发送信号函数没有返回值,槽函数执行不处理返回值2.信号、槽、连接都封装成了类3.推荐信号和槽参数一致4.主要用到地方:底层通信机制来看看怎么使用...
2022-07-08 16:32:09
280
原创 apollo源码解读:无锁队列BoundedQueue
在此贴出来apollo源代码,本篇只是源码解读,想要看此文件依赖的相关文件可访问:https://github.com/ApolloAuto/apollo/tree/master/cyber/base1.整个类是个数组,指定大小的数组,意味着数据是连续存储的。2.Init的时候会申请好相关的内存,大小为(N+2)*单个大小,为什么是n+2?想不通3.数据的存储如下图所示 队列大小是固定的,超过指定数量再进行加入会失败。数据是循环往复利用的,感觉上就是环形内存池4.之所以是无锁队列是因为底层有原子操作5
2022-07-07 13:53:06
281
原创 apollo源码解读:/cyber/sysmo 模块
SysMo是一个用DECLARE_SINGLETON宏实现的单例类,在公开函数cyber::Init里面执行了SysMo::Instance进行实例化,SysMo构造函数执行了自己的Start函数,检测环境变量sysmo_start的值是否为1,若为1则开启一个线程不停的调用scheduler::Instance()->CheckSchedStatus,调用间隔为100毫秒,上述CheckSchedStatus函数执行逻辑是遍历所有执行器的快照状态,是否为空闲,若在干活则输出干了多长时间了以及协程的名字,线
2022-07-01 13:05:15
139
原创 apollo源码解读:/cyber/scheduler 模块
cyber提供的三大功能:调度功能、通讯功能、组件。其中调度功能最核心的逻辑在/cyber/scheduler下面,本篇文章主要自己对该模块的研读和理解,可能会有错误,看到的朋友帮忙点播一下。首先看下牵涉到协程的一些基本概念图谱,对协程有些基本的概念和了解 再次看下阿波罗设计的协程-调度系统类关系图谱,这个理解这个图谱会对阅读源代码有所帮助,推荐边看源代码边看图谱 里面有两大调度方案:classic(经典)和choreography(编排),图谱如下 进入正文cyber主要提供了两种协程的调度方案class
2022-06-24 16:11:28
909
原创 apollo源码解读:/cyber/croutine 模块
本篇解读一下/cyber/croutine模块,该模块文件比较少,detail文件夹,CRoutine类,RoutineFactory模板类1.detail文件夹主要实现类似linux下的ucontext_t结构和其四个关联函数getcontext、setcontext、makecontext、swapcontext.实现堆栈的创建保存和切换,为什么不使用linux自带api而是要自己用汇编实现呢?有博主文章说linux那一套api最终要牵扯到系统内核里面,cyber自己实现这一套完全是应用层的,可以进一
2022-06-17 16:45:57
354
2
原创 apollo源码解读:cyber的Service踩坑笔记
1.坑描述:不用临时变量接收函数node->CreateService返回值导致服务创建失败2.前戏:cyber作为ROS的替代品提供了主要两大功能:调度功能和通讯功能.通讯功能包括订阅发布模式和一问一答的Service模式.本篇主要讲的是Service模式下的一个坑.Service的主要实现代码在/cyber/service下面,仅4个文件(两个头文件两个实现文件).可谓相当的精巧.怎么使用呢?源代码里面/cyber/examples/service.cc.50多行代码展示了如何使用他的Service功能
2022-06-08 16:15:26
268
2
原创 apollo源码解读:/cyber/task 模块
在这里就不贴源代码,太占空间了,源码连接:https://github.com/ApolloAuto/apollo/tree/master/cyber/taskcyber下面的task包是使用cyber协程的入口包,共有5个文件如下:BUILD文件:构建文件task_manager.h文件:任务管理头文件task_manager.cc文件:任务管理主文件task_test.cc文件:任务管理测试文件task.h文件对task_manager封装使用的文件构建文件和测试文件不再赘述,和其他包类似,比
2022-06-01 13:43:58
388
原创 apollo源码解读:进程或线程设置调度策略、优先级
1.利用setpriority调整“进程”优先级,测试优先级对进程的影响(注:是进程而不是线程)定义函数 int setpriority(int which,int who, int prio);参数1 : PRIO_PROCESS who为进程识别码 PRIO_PGRP who 为进程的组识别码 PRIO_USER who为用户识别码参数2 :参数3 :prio介于-20至20之间。代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。此优先权默认是0,而只有超级用户(root)
2022-05-27 14:22:21
597
原创 apollo源码解读:进程或线程绑定指定CPU
1.简介CPU绑定指的是在多CPU的系统中将进程或线程绑定到指定的CPU核上去执行。在Linux中,我们可以利用CPU affinity属性把进程绑定到一个或多个CPU核上。CPU Affinity是进程的一个属性,这个属性指明了进程调度器能够把这个进程调度到哪些CPU上。 该属性要求进程在某个指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器。CPU Affinity分为2种:soft affinity和hard affinity。soft affinity只是一个建议,如果不可避免,调
2022-05-20 17:26:59
310
原创 apollo源码解读:std::atomic实现读写锁
直接上源代码吧,代码是阿波罗团队写的源代码,我这边给加了注释/*1.有一说一这个读写锁的设计还是很牛逼的,以我自己感觉atomic和读写完全不相干的东西竟然可以用前者实现后者2.这个设计理念是不是百度阿波罗团队自创的呢?好像不是,这有个连接,设计理念很相似,15年的博客: https://blog.csdn.net/10km/article/details/49641691*/#ifndef CYBER_BASE_ATOMIC_RW_LOCK_H_#define CYBER_BASE_
2022-05-12 15:39:27
673
原创 38.借用与引用
/*1.rust中借用和引用的附带功效都一样,就是都有生命周期。借用使用&关键字,引用使用ref关键字。借用的对象是必须存在的,引用的对象可以虚拟的,后期附上对象。2.match的模式匹配上只能使用 ref,在函数声明上只能使用&来表示引用类型3.非要给区分ref和&到底哪个是引用,哪个是借用。我们可以先从词性划分,引用我归类为名词,而借用归类为动词。&A在表达式上 表示借用A,这是一个动作,那结果就是产出一个引用类型。所以let ref B表示声明了一个引用类型,它.
2021-03-12 11:05:42
812
原创 37.rust属性.txt
=====================================================================================================================================元素 在Rust中,Item是Crate(库)的一个组成部分。它包括 extern crate声明 use声明 模块(模块是一个Item的容器) 函数 type定义 结构体定义 枚举类型定义 常量定义 静.
2021-03-09 12:53:36
255
原创 36.rustc编译参数.txt
/* --cfg SPEC - 传入自定义的条件编译参数,使用方法如:rustc --cfg hello main.rs--crate-type - 指定编译输出类型,它的参数包括 rustc --crate-type staticlib myhello.rs 链接库生成.a的链接库 bin - 二进行可执行文件 -> bin或者lib二选一 lib - 编译为库 -> rlib - Rust库 .
2021-03-09 12:53:02
547
原创 35.cargo配置参数.txt
######################################################################## 详细教程地址:https://learnku.com/docs/cargo-book/2018/# https://www.jianshu.com/p/22a467204def?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_so.
2021-03-09 12:52:05
793
原创 34.rust宏.txt
/*更多请看:http://blog.hubwiz.com/2020/01/30/rust-macro/https://github.com/rooat/RustLearn/blob/master/src/appendix-04-macros.mdhttps://rustcc.gitbooks.io/rustprimer/content/macro/macro.htmlhttps://rust-by-example.budshome.com/macros.html定义:Rust宏让你可以发.
2021-03-09 12:51:34
215
原创 33.文件与 IO.rs
use std::fs;use std::fs::File;use std::fs::OpenOptions;use std::io::prelude::*;use std::io::stdin;fn main() { //Rust 中主函数是个无参函数,环境参数需要开发者通过 std::env 模块取出 let args = std::env::args(); println!("{:?}", args); for arg in args { .
2021-03-09 12:50:40
157
原创 32.生命周期注释.rs
/*更多文章参考:https://github.com/rooat/RustLearn/blob/master/src/ch10-03-lifetime-syntax.mdhttps://github.com/rooat/RustLearn/blob/master/src/ch19-02-advanced-lifetimes.md*///返回的是新生成的String,有自己的生命周期,如果使用&str的话生命周期跟随他人fn longer1(s1: String, s2: String.
2021-03-09 12:49:55
504
原创 31.错误处理.rs
/*程序中一般会出现两种错误:可恢复错误和不可恢复错误可恢复错误:可恢复错误的典型案例是文件访问错误,如果访问一个文件失败,有可能是因为它正在被占用,是正常的,我们可以通过等待来解决不可恢复错误:由编程中无法解决的逻辑错误导致的,例如访问数组末尾以外的位置对于可恢复错误用 Result<T, E> 类来处理,对于不可恢复错误使用 panic! 宏来处理。enum Result<T, E> { Ok(T), Err(E),}在 Rust 标准库中可能产生.
2021-03-09 12:48:57
156
原创 30.并发.rs
/*安全高效的处理并发是 Rust 诞生的目的之一,主要解决的是服务器高负载承受能力。并发(concurrent)的概念是只程序不同的部分独立执行,这与并行(parallel)的概念容易混淆,并行强调的是"同时执行"。Rust 中通过 std::thread::spawn 函数创建新线程.*/use std::sync::mpsc;use std::thread;use std::time::Duration;fn spawn_function() { for i in 0..
2021-03-09 12:48:19
96
原创 29.rust类型转换.rs
/*1.基本类型可以通过显示类型转换机制(as)来实现相互之间的转换。2.Rust通过使用trait来处理定制类型(enum、struct)之间的类型转换。3.通用的类型转换一般使用的trait为From和To。Rust孤儿原则:在声明trait和impl trait的时候,Rust规定了一个Orphan Rule(孤儿规则):impl块要么与trait的声明在同一个的crate中,要么与类型的声明在同一个crate中。也就是说,不能在一个crate中,针对一个外部的类型,实现一个外部的tr.
2021-03-09 12:47:16
763
原创 28.特性trait.rs
/*特性(trait)概念接近于 Java 中的接口(Interface),但两者不完全相同。特性与接口相同的地方在于它们都是一种行为规范,可以用于标识哪些类有哪些方法trait Descriptive { fn describe(&self) -> String;}Descriptive 规定了实现者必须有是 describe(&self) -> String 方法。(必须实现所有方法)几个非常有用的标准库特性: Drop提供了当一个值退出作用域后执行代.
2021-03-08 12:43:54
132
原创 27.泛型generics.rs
/*fn max(array: &[i32]) -> i32 { let mut max_index = 0; let mut i = 1; while i < array.len() { if array[i] > array[max_index] { max_index = i; } i += 1; } array[max_index].
2021-03-08 12:43:19
76
1
原创 26.PhantomData幽灵数据.rs
/*它在标准库中的定义如下:#[lang = "phantom_data"]#[stable(feature = "rust1", since = "1.0.0")]pub struct PhantomData<T: ?Sized>;可以到它只是一个不占用任何空间的单元结构体,#[lang = "phantom_data"], 也表明了它是一个语言项,供 Rust 编译器本身使用。https://blog.csdn.net/wowotuo/article/details/931.
2021-03-08 12:42:42
425
原创 25.智能指针.rs
/*参考文章:https://zhuanlan.zhihu.com/p/112307245https://rustcc.cn/article?id=76e5f3fb-20b9-48c9-8fc6-a0aad40ced8chttps://www.codercto.com/a/27950.htmlhttps://www.twle.cn/c/yufei/rust/rust-basic-smart-pointers.htmlhttps://www.cnblogs.com/dream397/p/1418.
2021-03-08 12:42:05
84
原创 24.内存操作Copy-Move-Clone.rs
/*详细请看:https://zhuanlan.zhihu.com/p/21730929https://zhuanlan.zhihu.com/p/184907190Clone VS Copy VS Move首先看一下这个两个trait的关系:pub trait Sized { // Empty.}pub trait Clone: Sized { fn clone(&self) -> Self; fn clone_from(&mut self,.
2021-03-08 12:41:28
234
原创 23.所有权.rs
/* 所有权1.Rust 中的每个值都有一个变量,称为其所有者。2.一次只能有一个所有者。3.当所有者不在程序运行范围时,该值将被删除。变量与数据交互方式主要有移动(Move)和克隆(Clone)两种。可以引用租借*/fn main() { { // 在声明以前,变量 s 无效 let _s = "runoob"; // 这里是变量 s 的可用范围 } // 变量范围已经结束,变量 s 无效 test1.
2021-03-08 12:40:49
95
原创 22.循环控制.rs
fn main() { //while 循环 let mut number = 1; while number != 4 { println!("{}", number); number += 1; } //Rust 语言到此教程编撰之日还没有 do-while 的用法,但是 do 被规定为保留字,也许以后的版本中会用到。 // Rust 中没有for循环使用三元语句控制循环,需要用 while 循环来代替 /.
2021-03-08 12:40:18
77
原创 21.println输出打印.rs
fn main() { let a = 12; println!("a is {0}, a again is {0}", a); println!("{{}}"); }
2021-03-08 12:39:44
123
原创 20.if条件语句.rs
fn main() { // if else let number = 7; if number < 5 { println!("值小于5"); } else if number >5 { println!("值大于5"); } else { println!("值为5"); } //Rust 中的条件表达式必须是 bool 类型,例如下面的程序是错误的 /...
2021-03-08 12:38:50
158
原创 19.函数的使用.rs
fn main() { another_function(5, 6); println!("{}",test_return()); println!("{}",test_return2());}// Rust不在乎您在何处定义函数,只需在某个地方定义它们即可。// Rust 中定义函数如果需要具备参数必须声明参数名称和类型:fn another_function(x: i32, y: i32) { println!("x 的值为 : {}", x); ...
2021-03-08 12:38:16
143
原创 18.self关键字.rs
#[derive(Debug)]struct MyType { name: String}impl MyType { fn do_something(self, age: u32) { //等价于 fn do_something(self: Self, age: u32) { //等价于 fn do_something(self: MyType, age: u32) { println!("name = {}", self.name); .
2021-03-05 11:31:19
78
原创 17.默认值Default.rs
fn test_1() { //没有初始化会编译报错.use of possibly-uninitialized `i` let i: i8 = Default::default(); let (x, y): (Option<String>, f64) = Default::default(); let (a, b, (c, d)): (i32, u32, (bool, bool)) = Default::default(); println!("{}.
2021-03-05 11:30:05
242
原创 16.枚举中的option和result.rs
fn test_option() { //Option 是 Rust 标准库中的枚举类,这个类用于填补 Rust 不支持 null 引用的空白 /* enum Option<T> { Some(T), None, } */ let opt = Option::Some("Option_Some_str"); match opt { Option::Some(s.
2021-03-05 11:28:21
210
1
原创 15.枚举enum.rs
//枚举类在 Rust 中并不像其他编程语言中的概念那样简单,但依然可以十分简单的使用#[derive(Debug)]enum Book { Papery, Electronic,}//如果你现在正在开发一个图书管理系统,你需要描述两种书的不同属性(纸质书有索书号,电子书只有 URL),你可以为枚举类成员添加元组属性描述enum Book2 { Papery(u32), Electronic(String),}//如果你想为属性命名,可以用结构体语法e.
2021-03-05 11:27:36
71
原创 14.结构体struct.rs
//Rust 里 struct 语句仅用来定义,不能声明实例,结尾不需要 ; 符号,而且每个字段定义之后用 , 分隔#[derive(Debug)]struct Site { domain: String, name: String, nation: String, found: u32}fn main() { let runoob = Site { domain: String::from("www.runoob.com"), .
2021-03-05 11:24:57
133
原创 13.迭代器.rs
/*在Rust中,迭代器共分为三个部分:迭代器、适配器、消费者。_迭代器_给你一个值的序列_适配器_操作迭代器,产生一个不同输出序列的新迭代器_消费者_操作迭代器,产生最终值的集合迭代器本身提供了一个惰性的序列,适配器对这个序列进行诸如筛选、拼接、转换查找等操作,消费者则在前两者的基础上生成最后的数值集合更多请看https://blog.csdn.net/guiqulaxi920/article/details/78823541*/use std::collections::Has.
2021-03-05 11:23:31
68
原创 12.映射表map.rs
/* 映射表*/use std::collections::HashMap;fn test_1() { println!("-------------------------test_1-------------------------"); let mut map = HashMap::new(); //这里没有声明散列表的泛型,是因为 Rust 的自动判断类型机制。 map.insert("color", "red"); map.insert("size",.
2021-03-05 11:20:41
81
原创 11.向量vector.rs
/*向量(Vector)是一个存放多值的单数据结构,该结构将相同类型的值线性的存放在内存中。向量是线性表,在 Rust 中的表示是 Vec<T>。向量的使用方式类似于列表(List),我们可以通过这种方式创建指定类型的向量:*/fn test_1() { let vector: Vec<i32> = Vec::new(); // 创建类型为 i32 的空向量 let vector = vec![1, 2, 4, 8]; // 通过数组创建向量 .
2021-03-05 11:20:09
109
原创 10.切片slice.rs
//切片(Slice)是对数据值的部分引用。//..y 等价于 0..y//x.. 等价于位置 x 到数据结束//.. 等价于位置 0 到结束fn main() { //最简单、最常用的数据切片类型是字符串切片(String Slice)。 let s = String::from("broadcast"); let len = s.len(); let part1 = &s[0..5]; let part2 = &s[5..len];.
2021-03-05 11:19:37
109
python2.7.8 32
2016-05-25
AStar 算法实例
2015-07-18
Visual Assist X补丁
2015-06-18
cmake-3.14.3-win64-x64.zip
2019-09-05
跨平台高性能TCP服务器框架 &boost;
2018-06-25
网狐IOCP压缩版
2018-06-22
用C++实现的壳
2017-09-14
像加载DLL一样加载EXE
2017-09-10
protobuf-2.61最新版
2017-08-28
Gh0stVC6到VS2010迁移所有问题的解决方法
2017-08-15
SSDTHook实现进程保护
2017-06-09
SkinSharp开发库+百款皮肤+皮肤编辑器
2017-05-24
minhook-1.3.2
2017-05-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人