0%

libco是微信后台开发和使用的协程库,同时应该也是极少数的将C/C++协程直接运用到如此大规模的生成环境中的案例了。

《云风coroutine协程库源码分析》中,介绍了有栈协程的实现原理。相比coroutine,libco在性能上号称可以调度千万级协程。 从使用上来说,不仅提供了一套类pthread的协程通信机制,同时可以零改造地将三方库的阻塞IO调用协程异步化。
本文将从源码角度着重分析libco的高效之道。

在正式阅读本文之前,如果对有栈协程的实现原理不是特别了解,建议提前阅读《云风coroutine协程库源码分析》

同时,我也提供了libco注释版,辅助大家理解libco的代码。

阅读全文 »

C++11中推出了三种智能指针,unique_ptr、shared_ptr和weak_ptr,同时也将auto_ptr置为废弃(deprecated)。

但是在实际的使用过程中,很多人都会有这样的问题:

  1. 不知道三种智能指针的具体使用场景
  2. 无脑只使用shared_ptr
  3. 认为应该禁用raw pointer(裸指针,即Widget*这种形式),全部使用智能指针

本文将从这几方面讲解智能指针:

  1. 智能指针的应用场景分析
  2. 智能指针的性能分析: 为什么shared_ptr性能比unique_ptr差
  3. 指针作为函数参数时应该传,传值、传引用,还是裸指针?
阅读全文 »

最近在写C++时,有这样一个代码需求:在lambda中,将一个捕获参数move给另外一个变量。
看似一个很简单常规的操作,然而这个move动作却没有生效。

具体代码如下:

std::vector<int> vec = {1,2,3};

auto func = [=](){
auto vec2 = std::move(vec);
std::cout << vec.size() << std::endl; // 输出:3
std::cout << vec2.size() << std::endl; // 输出:3
};

代码可在wandbox运行。

我们期望的是,将对变量vec调用std::move后,数据将会移动至变量vec2, 此时vec里面应该没有数据了。但是通过打印vec.size()发现vec中的数据并没有按预期移走。

这也就意味着,构造vec2时并没有按预期调用移动构造函数,而是调用了拷贝构造函数。

为什么会造成这个问题呢, 我们需要结合std::movelambda的原理看下。(最终的解决方案可以直接看这里

阅读全文 »

随着Golang的兴起,协程尤其是有栈协程(stackful coroutine)越来越受到程序员的关注。协程几乎成了程序员的一套必备技能。

云风实现了一套C语言的协程库,整体背景可以参考其博客

这个协程库非常轻量级,一共也才200多行代码,使用上更贴近于lua的写法(众所周知,云风是知名的lua粉)。整体基于ucontext和共享栈模型实现了有栈协程,代码质量毋庸置疑,本文将详细剖析该协程库的实现原理。

同时,我也提供了coroutine注释版,辅助大家理解coroutine的代码。

阅读全文 »

微信云支付Android 智能POS使用WebSocket实现了用户订单的实时推送。即,顾客在扫描了门店的付款码,客户端会随即进行语音播报和打印等动作。

客户端利用WebSocket与后端维持长连接,当后端收到该门店订单时,即将成功态的订单通过对应的连接中。

然而,商户网络环境的多样性会导致WebSocket链路出现各种异常,从而引发漏单问题。

我们根据实际的场景,对此订单推送系统在稳定性上进行了大量优化,尽可能地提升了服务的可用性及自我恢复的能力。

阅读全文 »

在进行Linux网络编程开发的时候,免不了会涉及到IO模型的讨论。《Unix网络编程》一书中提到的几种IO模型,我们在开发过程中,讨论最多的应该就是三种: 阻塞IO非阻塞IO以及异步IO

本文试图理清楚几种IO模型的根本性区别,同时分析了为什么在Linux网络编程中最好要用非阻塞式IO。

阅读全文 »

在客户端开发中,往往会有一些功能对时间要求比较严格,客户端需要获取到当前最准确的时间。但由于客户端环境多种多样,我们无法保证直接在客户端设备上获取到的时间是最准确的时间。
对于某些问题设备来说,设备时间与比当前实际的时间差了几个小时,甚至几天的情况都存在。倘若某功能依赖于当前时间,而客户端所提供的时间不准,就往往会给客户造成一些困扰。

那么,客户端如何能够获取到当前最准确的时间呢?

阅读全文 »

muduo陈硕大神个人开发的C++的TCP网络编程库。muduo基于Reactor模式实现。Reactor模式也是目前大多数Linux端高性能网络编程框架和网络应用所选择的主要架构,例如内存数据库Redis和Java的Netty库等。

陈硕的《Linux多线程服务器端编程》一书对muduo整个架构进行了非常详尽的介绍和分析,可以说是学习muduo源码和设计理念最好的资料了。这本书也非常推荐大家购买阅读,感觉是后台开发的必读书目了。

而本文则主要是从源码角度辅助理解整个muduo的实现,同时也姑且算是对muduo的一个小小的补充。

同时本人也提供了一个muduo注释版,以辅助大家参考学习。

阅读全文 »

最近我用Golang开发了一个可以将数据库每张表的各个列信息转化成文档的小工具。开发的缘由是因为写后端时,经常需要为数据库写说明文档,对于稍微有些规模的项目来说,就动辄几十张上百张数据表,开发人员在文档中不断的写各个列的列名、类型、描述实在是无聊、枯燥和苦不堪言。所以就有了这个小工具的诞生。

项目地址在这里

阅读全文 »

2017年总共阅读了21本书,相比于2016年减少了4本。
今年读的这些书相对于去年来说种类比较全而且质量比较高, 但是有一个非常大的缺点就是没有留下可用的笔记,尤其是像《北宋名家词选讲》这种书,没有好的笔记留下,书里的精髓就会流失很多。
希望2018年的阅读能够做到以下几点:

  1. 读的每本非小说类书,都要认真的做笔记或者思维图
  2. 2018年可以阅读30本书以上
  3. 多把空闲时间放在用kindle读书上
阅读全文 »