Recent Posts
-
June 12, 2012
C++ 单例模式 和静态变量初始化顺序导致的dll加载失败问题
C++如果有很多静态变量处于不同的文件里面,静态变量的初始化顺序是不确定的。碰到一个bug,就是单例模式 静态变量实例A的构造函数里面去调用 类B的静态函数, B的这个静态函数里面访问了自己的静态成员编码C。结果A初始化实在B的静态变量的前面的,所以程序就crash了。因为是在静态变量的构造函数里面失败的,就只会出来一个对话框提示DLL初始化失败,如果是用loadlibrary的也会提示dll加载不成功的。 好像在类的构造函数里面,很容易碰到这种依赖初始化顺序导致的bug啊...
-
June 04, 2012
C++ 的placement new () 语法,在指定内存地址构建对象
经常看到这种用法,在这里又看到一个了https://github.com/facebook/folly/blob/master/folly/ProducerConsumerQueue.h最简单的, “new (指定的地址) ” 其实就是 在 指定的地址已经存在的内存上面调用构造函数建新的对象。 有时可以避免动态申请内存,提高性能,例子参考上面文件里面queue里面插入元素的构建。解释可以参考下面这两个。Placement syntaxhttp://en.wikipedia.org/wiki...
-
May 31, 2012
Linux tcpdump抓包程序原理,pf_packet socket接口相关的实现
PF_PACKET 往是专门用于抓包的,往系统网络层注册一个协议。然后所有的往外发的包和进来的包都会调到http://lxr.linux.no/linux+v3.4/net/packet/af_packet.c 这个文件里面 的packet_rcv() 函数,其中 outgoing方向(出去的包)会在 dev_queue_xmit_nit里面遍历 ptype_all 链表进行所有网络协议处理的时候调用到packet_rcv 。incoming 方向(从外面其他机器进来的包会在 neti...
-
May 25, 2012
C++ template 模板实现分开在头文件和源文件导致的linker找不到函数实现的链接错误
C++的模板的代码,最好全部放在一个头文件里面,不然编译的时候,可能看到链接器找不到模板函数的错误。简单的就是模板的实例化的时候找不到定义。书中给出了好几种解决办法除了 全部放在头文件的 这种“Inclusion Model”办法之外,还有利用C++关键字 export的办法,其他几种办法自己去看书吧。上次一个同事碰到这个问题了,我当时也不知道。不知道以后会不会忘记了,记录一下便于查找方便。C++ Templates - The Complete Guide.pdf 一书的Chap...
-
May 21, 2012
Zeromq 基于无锁消息队列(lock Free的pipe)的无锁多线程模型 (actor model) 比较有意思的
原文地址: ZeroMq的架构文档http://www.aosabook.org/en/zeromq.html强烈建议读一下这个吧在线源码:https://github.com/zeromq/libzmq/tree/master/src1.i_engine.hpp -> stream_engine.hpp有多种继承自i_engine的类调用socket api的代码就是在这里面。2.socket_base.hpp -> xsub_socket_t session_base...
-
May 15, 2012
一个单个消费者和生产者的无锁队列 (lock Free queue ringbuffer)的c++实现
下载LOFTER我的照片书 |因为只有两个线程,一个线程里面只修改一个head,另外一个修改tail指针,所以没有竞争的问题。x86可以保证写内存操作不会乱序,所以下面的简单时间是没有问题的。 一开始怀疑代码里面用spinlock+ std::list 做的一个队列是不是锁竞争导致性能问题,不过最后发现耗时都是在网络的read write操作上。这种的无锁的 ringbuffer的实现,在每秒 几千个的情况下根本看不出和spinlock的区别来。网上抄来的,随便看看吧,以后...
-
May 14, 2012
False sharing 的原理还是这篇文章讲的最清楚
http://software.intel.com/en-us/articles/avoiding-and-identifying-false-sharing-among-threads/Avoiding and Identifying False Sharing Among Threads多个线程同时写一个cache line的时候出现。
-
April 11, 2012
C和c++ 定时器管理队列结构
下载LOFTER我的照片书 | 不知道asio::deadline_timer 用的比较多的时候,性能怎么样? 打算自己在上层实现一个定时器的管理。这个为了能够在很多定时器里面找到最近超时的定时器,又要用比较小的代价。很多事件驱动库都是用个最小堆结构来管理的吧,好像linux内核里面分了几个长短不一的链表,这样每次只要去最快超时的那个队列去查找就可以了。不过最好就是只用一个定时器啦,这样就比较很多定时器查找的消耗,想以前 Linux的scsi驱动层,以前为每个request设一...
-
March 28, 2012
C++ 十六进制字符编码hex encode decode 和vc2010的性能分析工具(performance analysis)的使用
下载LOFTER我的照片书 | 因为要用到16进制编码的字符串编码,自己 其实也是考虑用stringstream写个简单的格式化函数。然后在网上确实找了一个,然后改了一下。copy起来就是简单啊,不用花太多的时间去敲代码和调试。这就是下面代码里面的hex_encode 和hex_decode函数。但感觉这种方便,生成的临时string对象很多,我那个应用其实是可以原地编解码的,就在网上找了个c风格的,就是下面的hex_encode 和 hex_decode,。从ht...
-
March 19, 2012
Boost bind 传递引用和指针的区别导致的bug
一个例子 。class A {public:virtual void print () { cout << "This is A" << endl;};};class B: public A {public:virtual void print () { cout << "This is B" << endl;};};void print( A & a){ a.print();}void test ( A &...