极品底层(C++)
蓝虎 - tanjp.com
Seeking a way to achieve my childhood dream! Concentration? Innovation? Solidarity? Goodness?
Design Simple, Graceful, High Efficiency and Excellence Code. http://www.tanjp.com
展开
-
非严格优先队列-O(1) 时间复杂度
原文转自:http://www.tanjp.com/archives/124(即时修正和更新)分组安全队列 - 非严格优先队列 O(1) 时间复杂度传统的优先队列,都是采用二叉树(堆)的方式来实现,插入和删除都需要维护堆顶元素最大或最小,需要O(logN)的时间复杂度。在某些多线程环境下,把队列当作一个数据交换的纽带,这种开销也是非常大的,于是设计了非严格的优先队列,基满足业务需求...原创 2019-04-11 15:41:47 · 1173 阅读 · 0 评论 -
时间轮(Timing Wheel)算法-高性能定时器策略笔记
原文转自:http://www.tanjp.com/archives/199(即时修正和更新)什么时候需要定时器?我们都知道程序是能快速运算出结果,几乎在一瞬间就可以把结果算出来。但是这个前提是所有输入条件都拿到手的情况下,如果有些输入条件 A 你并不知道什么时候能符合,那怎么办?写一个whlie循环一直检查?这样无疑很浪费CPU,显然行不通。有经验程序员可以已经想到办法,把这...原创 2019-05-17 20:58:28 · 4067 阅读 · 0 评论 -
Actor模式封装MongoDB C驱动-多连接并发与自动重试
原文转自:http://www.tanjp.com/archives/192(即时修正和更新)Actor模式封装异步的MongoDB C驱动MongoDB C驱动(MongoDB C Driver http://mongoc.org/),提供了同步的DB访问存储接口,在高并发的业务系统,同步操作会阻塞业务逻辑,是高并发的一大障碍。所以需要设计异步的接口来满足业务系统的需求。利用...原创 2019-05-17 01:05:07 · 299 阅读 · 0 评论 -
双缓冲安全队列(DoubleCacheQueue)与自旋锁(SpinMutex)
原文转自:http://www.tanjp.com/archives/144(即时修正和更新)双缓冲安全队列(DoubleCacheQueue)双缓冲区,故名思义就是要有两个缓冲区(简称A和B)。这两缓冲区,总是一个用于生产者,另一个用于消费者。当缓冲区触发某个条件时,进行一次切换(先前被生产者写入的转为消费者取出,先前消费者取出的转为生产者写入)。而这个触发的条件,一般是以快速消...原创 2019-05-07 15:51:14 · 1215 阅读 · 0 评论 -
窃取式调度器(Stealing Scheduler)-高并发
原文转自:http://www.tanjp.com/archives/141(即时修正和更新)窃取式调度器(Stealing Scheduler)N个业务系统生产作业加入到 M+1个队列里面(优先加入到当前线程所在队列),队列中的作业被 M个线程按一定的规则消费。M个线程都对应一个线程局部存储的队列,和一个公共的队列。该规则按以下次序执行:1、优先处理本线程生产的作业。2、...原创 2019-05-07 15:46:42 · 599 阅读 · 0 评论 -
分配式调度器(Allocation Scheduler)-有锁与无锁实现
原文转自:http://www.tanjp.com/archives/139(即时修正和更新)分配式调度器(Allocation Scheduler)N个业务系统生产作业加入到 1个分配队列里面,由 1个分配线程负责将队列中作业分配给 M个工作队列,每个工作队列对应 1个工作线程来消费作业。对分配队列的抢占为:N*1,对工作队列的抢占为1*1,也就是说总体队列的抢占为 N*1+1*1*M...原创 2019-05-07 15:41:21 · 286 阅读 · 0 评论 -
抢占式调度器(Preemptive Scheduler)-有锁与无锁实现
原文转自:http://www.tanjp.com/archives/137(即时修正和更新)抢占式调度器(Preemptive Scheduler)N个业务系统生产作业加入到一个队列里面,队列中的作业被 M个线程抢先消费。也就是说,N的业务系统抢着把生产出来的作业插入到队列,同时 M个线程抢着消费该队列的作业,对队列的抢占非常激烈。可简单竞争抽象为: N*M。 ...原创 2019-05-07 15:34:21 · 1347 阅读 · 0 评论 -
Actor模式实现高并发的异步文件日志系统(Actor Log)
原文转自:http://www.tanjp.com/archives/176(即时修正和更新)文件日志异步读写我们都知道普通的读写文件打开文件都是同步的,比如C的fopen, fclose, fread等。并且磁盘的访问速度远远的低于内存,所以操作系统要阻塞等待磁盘设备准备好才进行读写。如果采用同步,那么上次业务逻辑将会阻塞挂起,等待磁盘把数据准备好,再通知操作系统上报到应用层。高...原创 2019-05-09 23:23:43 · 481 阅读 · 0 评论 -
Actor模式之高性能并发框架的实现
原文转自:http://www.tanjp.com/archives/149(即时修正和更新)概念Actor模式是一种并发模型,其目标是充分利用计算机多核的优势,把一个大问题分拆成多个小问题并发处理,或者把多个平行的问题并发处理。一个Actor指的是一个最基本的计算单元。它能接收一个消息并且基于其执行计算。Actor一大重要特征在于Actor之间相互隔离,它们并不互相共享内存。也就是说,...原创 2019-05-08 23:02:41 · 2097 阅读 · 1 评论 -
高性能仿函数(FixedFunction)-替代std中的function
原文转自:http://www.tanjp.com/archives/135(即时修正和更新)固定大小仿函数(FixedFunction)仿函数是C++很多新特性的基础,如 lambda表达式。但是STL提供的std::function兼顾了太多情况,性能不高。于是做了优化,实现代码如下:template <typename SIGNATURE, size_t STOR...原创 2019-04-25 12:32:08 · 600 阅读 · 0 评论 -
全局唯一标识(UID)-多种实现方案
原文转自:http://www.tanjp.com/archives/132(即时修正和更新)目录64位全局唯一标识62进制字符串唯一ID32位唯一ID(一年(388天)内的每秒内有128个唯一值)32位唯一ID(一个月(48天)内的每秒内有1024个唯一值)32位唯一ID(一周(12天)内的每秒内有4096个唯一值)64位全局唯一标识snowflake是用64位...原创 2019-04-12 23:39:45 · 2717 阅读 · 0 评论 -
安全队列(SafeQueue)-多线程安全
原文转自:http://www.tanjp.com/archives/118(即时修正和更新)多线程安全的先进先出队列多线程安全的队列,可支持临界条件的阻塞与非阻塞两种模式切换。可通过条件变量来挂起等待加入/取出,条件满足时又能即时唤醒加入/取出。思路和想法都比较简单,就是一些应用的方法,就不多说了,直接看代码很好了解。template<typename tpTyp...原创 2019-04-09 15:23:35 · 2411 阅读 · 0 评论 -
单例模式(Singleton)-多线程安全
原文转自:http://www.tanjp.com/archives/115(即时修正和更新)多线程安全的单例模式单例模式,是一种常用的软件设计模式。通过单例模式可以保证系统中,应用该模式的一个类型只有一个实例。多线程环境下,建议使用 sptr() 获得共享智能指针使得对象的释放得以延伸到最后一个有效引用使用完。各个类型的单例对象的作用域为全局(类似全局变量),但同时可以...原创 2019-04-08 16:50:31 · 204 阅读 · 0 评论 -
C++编码规范
原文转自: http://www.tanjp.com/archives/110(即时修正和更新)前言使代码易于管理的方法之一是加强代码一致性。让任何程序员都可以快速读懂你的代码这点非常重要。保持统一编程风格并遵守约定意味着可以很容易根据“模式匹配”规则来推断各种标识符的含义.。创建通用,必需的习惯用语和模式可以使代码更容易理解。在一些情况下可能有充分的理由改变某些编程风格,但我们还是应...原创 2019-04-08 16:44:04 · 377 阅读 · 0 评论 -
定时器实现过程遇到的问题
原文转自:http://www.tanjp.com/archives/203(即时修正和更新)定时器实现过程遇到的问题在服务端的程序里,时间是一个很常用,几乎无处不在的变量。如果不正确使用时间,将会导致灾难性的数据错误。所以,正确使用时间非常重要!怎样才算是正确使用时间?首先,我们得知道在程序世界里面,时间有哪些值?1、协调世界时,又称世界统一时间,世界标准时间,国际协...原创 2019-05-28 20:41:52 · 908 阅读 · 0 评论