- 博客(46)
- 收藏
- 关注
原创 【百度brpc源码阅读】内存管理
源代码:1、https://github.com/apache/incubator-brpc/blob/master/src/butil/resource_pool.h2、https://github.com/apache/incubator-brpc/blob/master/docs/cn/memory_management.md说明文档:https://github.com/apache/incubator-brpc/blob/master/src/butil/resource_pool_inl.
2020-10-23 18:30:53
507
原创 2021-03-18
from:https://github.com/apache/incubator-brpc/blob/master/src/bthread/remote_task_queue.hRemoteTaskQueue是一个简单的队列,使用一把锁保护确保线程安全。这个队列的功能是用来存储非worker线程创建的bthread。// Licensed to the Apache Software Foundation (ASF) under one// or more contributor license a
2021-03-18 21:10:45
188
原创 brpc源代码分析-定时器Timer
源代码地址:https://github.com/apache/incubator-brpc/blob/master/src/bthread/timer_thread.h阅读源代码,不仅可以了解到功能的具体实现方法,还能够学习大神们的思考和设计思路。所以在未来一段时间,通过阅读分析源代码的方式,研究brpc的实现和设计思路。本节首先从定时器开始。定时器相关文档:https://github.com/apache/incubator-brpc/blob/master/docs/cn/timer_keep
2021-03-18 15:45:20
743
原创 【brpc】ResourcePool详解
原地址:https://github.com/apache/incubator-brpc/blob/master/src/butil/resource_pool_inl.h说明文档:https://github.com/apache/incubator-brpc/blob/master/docs/cn/memory_management.md// Licensed to the Apache Software Foundation (ASF) under one// or more contrib
2021-03-16 17:07:17
728
原创 [brpc]thread local代码解读
from :https://github.com/apache/incubator-brpc/blob/master/src/butil/thread_local.cpp功能:当线程退出时,执行一些指定的操作。设计ThreadExitHelper 类用于管理函数及其参数。函数和参数使用pair管理,所以这个类维护一个pair的vector。主要功能是涉及到这个vector的增删。另外就是对象析构时,按照顺序调用vector中的函数.每个线程维护一个单独的ThreadExitHelper。
2020-12-23 17:40:53
486
原创 pthread_once和pthread_key_t
一、pthread_once在多线程编程中,有些工作只需要某个线程做一次就够了,这个时候可以使用pthread_once。 pthread_once表示在所有线程中,只执行一次。为此需要有一个变量与之配合:#include <pthread.h>pthread_once_t pthr_once = PTHREAD_ONCE_INIT; //需要用宏初始化int pthread_once(pthread_once_t *once_control, void (*init_routin
2020-12-23 16:11:34
320
1
原创 [C++基础]
今天看代码,看到别人include了variant,所以在网上找了一下。发现https://zhuanlan.zhihu.com/p/57530780这个文章不错,特此记录。
2020-12-21 15:44:52
131
原创 【C++基础】宏定义
在C/C++编程中,宏是经常用到的一种编程技术。虽然之前的编码中,经常用到宏,但是理解并不深入和准确,特此在此总结一下。宏的作用:在预处理阶段,实现展开完成代码的替换。核心的功能就是完成源代码的替换。本文主要介绍一般宏的定义,#及##的使用。1、一般使用方法:#define Test(x, y) x + yint main(){ int a = 10; int b = 5; Test(a, b); return 0;}替换完之后的效果:int main(){
2020-12-14 18:20:57
819
原创 【brpc】WorkStealingQueue注释解读
注解brpc.WorkStealingQueue用来在一个线程之内存储准备被处理的任务。只有本线程可以push或者pop任务,所以这两个接口不会同时有多个线程访问。另外一个接口steal()用来让其他线程有机会从本线程偷得任务,所以steal可能和push、pop以及steal同时被调用。比较有意思的设计:队列的bottom和top支持增长,采用和(capacity-1)按为&的方式,确定实际的值。队列的长度capacity需要是2的N次方。(capacity-1)是一个各位全是1的整数
2020-12-11 15:56:35
492
2
原创 std::move()的思考
首先看一下这个函数的定义:template <class T>std::remove_reference<T>::type&& move(T && param){ return static_cast<std::remove_reference_t<T>::type&&>(param)}...
2020-04-30 12:47:41
188
原创 引用折叠和完美转发
最新学习C++11,发现引用折叠和完美转发的概念非常的不好理解。今天发现了一篇文章,可以把这两个概念讲的特别清楚。from:https://zhuanlan.zhihu.com/p/508164201、引用折叠T& & = T&T& && = T&T&& & = T&T&& &am...
2020-04-30 12:07:17
223
原创 函数中返回局部对象,但是没有调用拷贝构造函数?!
class Person{ public: Person() : age(10) { std::cout << "Person construct" << std::endl; } Person(const Person & p) { ...
2020-04-29 17:50:45
1424
1
原创 函数对象
函数对象是指一个类,显式的重载了()运算符。 当该类型的对象使用括号运算符时,表现的像是调用了一个函数。函数对象的好处:#1 可以完成和普通函数相同的功能#2 因为属于一个对象,所以可以保存一些中间状态或者信息。参考: https://blog.csdn.net/BonChoix/article/details/8050627...
2020-04-27 15:53:45
200
原创 非暴力沟通
最近读了一本《非暴力沟通》。虽然沟通的人员、沟通方式、沟通的内容等多种多样,极其复杂,但是做着通过高度抽象之后,把沟通的内容概括为四个方面:观察,感受、需求和请求。观察:不带任何评价的观察。只说出自己观察到的情况,而不加上自己的评价。 一般沟通中,往往会把观察到的情况和自己的评论放在一块儿表达出来。 评论的背后其实是自己的价值观和判断,这非常容易引起其他沟通方的不满和反抗。感受: 一般我们认为...
2020-01-02 18:42:43
267
原创 ffmpeg函数功能
int av_read_frame(AVFormatContext *s, AVPacket *pkt);从流中读取一个视频帧。
2019-12-12 17:19:19
192
原创 ffmpeg的time_base
ffmpeg的time_base是个比较有意思的概念,在不同的上下文中,会有不同的time_base。time_base:时间基准的单位, 这个是一个分数。tb1 = {a,b}tb2 = {c,d}tb1的k值,转换成tb2的过程为:l = k*a/b/(c/d)...
2019-12-12 16:35:04
177
原创 ffmpeg基础知识
DTS和PTSDTS是指 decode timestamp ,解码时间戳PTS是指presentation timestamp ,展示时间戳。I帧,关键帧,自己可以直接解压缩成一个完整的图像P帧,向前预测帧,保持的是和前一个关键帧的图片的变化,所以需要有前一个关键帧,才可以正确的解压缩。B帧,记录的是本帧和前后I或者P帧的差别。所以,为了解码B帧,不仅要缓存前面帧的解码结果,还要缓存后面...
2019-12-12 11:25:58
183
原创 pthread_mutex_t和std::mutex
简单总结:pthread_mutex_t是支持pthread的系统使用的锁,并且支持比较丰富的操作。std::mutex是C++语言实现的互斥锁,功能非常简单。具有跨平台的功能。如果对互斥锁没有特别的要求,尽量使用std::mutex。...
2019-12-06 15:52:37
2905
1
原创 C++实现快速排序
C++实现快速排序#include <iostream>void sort(int a[], int left, int right){ if (left >= right) { return; } int i = left; int j = right; int key = a[i]; while (...
2019-12-06 15:05:12
135
原创 vector中会造成迭代器失效的操作
在使用vector时,迭代器经常被用到。 有一些操作会造成迭代器失效,在此特别记录,避免入坑。首先,先来看一个题目: 在vector中插入0~20,然后从当中删除偶数。#include <vector>#include <iostream>int main(int argc, char * argv[]){ std::vector<int> vec...
2019-12-03 20:06:48
1096
1
原创 vector的resize函数和reserve函数的区别
resize和reserve函数的区别是在面试c++经常遇到的问题。resize(num, val)这个函数的功能是调整vector内存的大小为num。如果vector中的元素原来没有num那么多,则会把元素数量扩展到num个,并且新创建的元素会使用val进行初始化。如果vector的元素比num个数多,则超过的部分元素会被删除掉。resize确保vector中的元素个数数num个。调...
2019-12-03 17:48:11
397
原创 emplace_back为什么比push_back快这么多?
push_back:因为push_back要求输入的参数是一个已经存在的对象。 当输入的参数,不是这样的对象时,会调用对应类的构造函数,构造一个临时的对象。然后把这个对象执行拷贝构造函数或者移动构造函数插入到vector中。emplace_backemplace_back可以直接使用参数,在本地构建对象。这样一来,只需要调用构造函数,没有调用拷贝构造函数或者移动构造函数的过程。...
2019-12-03 17:37:36
1891
原创 Python基础知识-字符串(三)
本节主要介绍字符串的常用的函数。 在写程序的过程中,对字符串的操作是一种非常常见的操作,所以本节的各种字符串函数,使用到的频率都很高。1、centercenter方法用来把调用字符串放到中间,并且把两端用某个字符补齐。默认使用空格补齐。调用形式:center(新字符串长度,补齐用的字符)例如:aa = "beijing"aa.center(20)结果:' beijing ...
2019-12-02 15:17:46
244
原创 Python基础知识-字符串(二)
本节介绍另外的字符串格式化方法,是使用函数的format函数。使用这种方法时,把需要替换的部分,用{}括起来, 括号中可以增加一些格式控制用的参数。 具体如下:ss = "Beijing""Welcome to {}".format(ss) # 系统会用参数ss的内容,替换前面到前面的{}结果为:Welcome to Beijing#可以有多个参数"Welcome to {}, {...
2019-12-02 12:26:56
169
原创 Python基础知识-字符串(一)
字符串是Python中非常基础,非常常用的一种数据类型。从这节开始介绍Python的字符串的使用方法。1、字符串的基本操作ss = "hello, world" #定义一个字符串ss[1] #使用索引,获取某个字符,结果为 'e'ss[0:2] #使用切片,获取一个子字符串。结果为 "he"ss[-3:] # 可以使用负数索引,并且可以使用缺省索引,缺省时表示到字符串结束。结果为 "rl...
2019-11-29 18:25:25
391
原创 nginx最近学习总结
最近看了一些nginx相关的文章,在此把自己对nginx的理解做个总结。 nginx是一个支持高并发的web服务器。高并发的原因重要的一点来源于其异步非阻塞的事件处理模式。进程模型nginx是采用的是一个master进程,多个worker进程的模型。master进程的工作:创建对端口号的监听套接字fork处一系列的子进程管理子进程的状态子进程的工作:接收新的连接请求处理已...
2019-11-29 16:40:27
227
原创 Python数据结构--元组
这一节介绍另外一种非常基础的数据结构--元组。 元祖的功能和列表差不多,最大的一点区别就是**元组是不可以被修改的。**1、元组的表示方式把一组值,用逗号分隔,就组成了一个元组,例如:a = 1,2,3print(a)结果为:(1,2,3) #一般情况下,元组都用()括起来.元组的元素可以是任意的值,包括字符串、整数,元组或者列表。如下:a = (1,"234",[1,2...
2019-11-22 16:00:39
375
原创 Python数据结构--列表(四)
1、列表的修改列表中元素的内容是可以被修改的1.1 单个元素的修改修改单个元素比较简单,直接把新的值赋给指定索引的元素,就把原来的值覆盖了。例如:a = [1,2,3,4]a[1] = 100 #索引值为1的位置,对应的值位2print(a)结果为:[1,100,3,4]1.2 修改多个元素除了能够修改单个元素之外,还可以修改使用切片选中的多个元素。前面已经学过,切片就是...
2019-11-22 12:21:30
446
原创 Python数据结构--列表(三)
本节介绍列表的切片。 切片简单来说,就是可以获取或者操作列表的一段。如下一个列表a = [1,2,3,4,5,6]如果我们想得到第二个到第四个元素组成的列表可以怎么办?利用前面学到的知识,可以这么办:a = [1,2,3,4,5,6]b = []b.append(a[1])b.append(a[2])b.append(a[3])虽然操作比较多,但是我们还是完成了自己需要的...
2019-11-21 21:47:39
359
原创 Python数据结构--列表(二)
1、列表元素删除列表中有了众多元素之后,可能会遇到需要删除全部元素或者某个元素的时候。1.1 删除全部元素如果想清空列表中的全部元素,可以使用clear()方法.如下:a = [1,2,3]a.clear()print(a)打印结果为[] #空列表1.2 删除其中某个元素如果只是想删除其中某个元素,可以使用del命令。如下:a = [1,2,3,4,5]del a[2...
2019-11-21 19:22:11
474
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅