11 2012 档案
摘要:生产者消费者问题,是永远的经典. 单纯让多个线程去竞争,占有资源然后处理,会让系统的复杂度变得相当复杂,并且整个系统的并发也很难控制.为了让系统简单化,流畅化,引入消息队列,而且这样,系统更具有相当高的吞吐量.因为做的事情简单而有效. 根据具体业务的不同,个人(认为)把消息队列分为1:1模型,还有就是N:M模型的. 如果消费者的消费能力非常高.个人认为就应该使用1:1的队列.这种队列足够简单,可以进行各种优化,比如避免动态内存分配,锁优化,使用lock-free等.这样可以让主循环的等待时间降到最低,使其可以专心致志进行各种逻辑处理. 有时,有些业务逻辑,不是很在乎时许,允许比较小...
阅读全文
摘要:我实现的网络库中使用了C++11中的shared_ptr. 昨天做profile,发现很多CPU都消耗在shared_ptr上,所以打算看看shared_ptr的效率如何. 实验是这样的,弄一个临时的shared_ptr,然后不停的拷贝,拷贝100W次,看消耗多长时间.实验对象是gcc 4.6.2和clang 3.1(libc++).最后输出各自消耗的时间,编译选项,O0和O2. 上代码:#include <thread>#include <memory>#include <unistd.h>#include <iostream>#include
阅读全文
摘要:llvm带来很多很多好用的东西,比如clang,还有一个STL实现:libcxx.其优点不表,就说怎么打印STL容器内的元素吧. 实际上gdb,包括任何调试工具,都是不了解STL的,因为他不知道STL内部是怎么实现的.所以需要展示STL内部元素的时候,就需要用到一些脚本,或者插件之类的(VS也是这样).gdb在7.x支持python写插件,所以很多人都用python插件来打印libstdc++容器内的元素. llvm官方本身没有实现pretty printers,包括lldb这个项目也一样(只是实现了部分容器的parser). 本来还想讲讲怎么实现一个容器的parser,不过想想其实...
阅读全文