c/c++
文章平均质量分 83
kevinlynx
走在深化技术的路上,准备重新带好一个团队,做好一个产品
展开
-
基于protobuf的RPC实现
可以对照使用google protobuf RPC实现echo service一文看,细节本文不再描述。google protobuf只负责消息的打包和解包,并不包含RPC的实现,但其包含了RPC的定义。假设有下面的RPC定义:service MyService { rpc Echo(EchoReqMsg) returns(EchoRespMsg) }那么要实原创 2014-09-18 22:32:41 · 29935 阅读 · 1 评论 -
并行编程中的内存回收Hazard Pointer
接上篇使用RCU技术实现读写线程无锁,在没有GC机制的语言中,要实现Lock free的算法,就免不了要自己处理内存回收的问题。Hazard Pointer是另一种处理这个问题的算法,而且相比起来不但简单,功能也很强大。锁无关的数据结构与Hazard指针中讲得很好,Wikipedia Hazard pointer也描述得比较清楚,所以我这里就不讲那么细了。一个简单的实现可以参考我的gith原创 2015-05-03 20:44:55 · 2813 阅读 · 0 评论 -
使用RCU技术实现读写线程无锁
在一个系统中有一个写线程和若干个读线程,读写线程通过一个指针共用了一个数据结构,写线程改写这个结构,读线程读取该结构。在写线程改写这个数据结构的过程中,加锁情况下读线程由于等待锁耗时会增加。可以利用RCU (Read Copy Update What is rcu)的思想来去除这个锁。本文提到的主要实现代码:gistRCURCU可以说是一种替代读写锁的方法。其基于一个事实:当写线程原创 2015-04-19 19:12:16 · 3206 阅读 · 0 评论 -
记一次tcmalloc分配内存引起的coredump
现象线上的服务出现coredump,堆栈为:#0 0x000000000045d145 in GetStackTrace(void**, int, int) ()#1 0x000000000045ec22 in tcmalloc::PageHeap::GrowHeap(unsigned long) ()#2 0x000000000045eeb3 in tcmalloc::Page原创 2015-04-06 18:34:18 · 5405 阅读 · 0 评论 -
基于内存查看STL常用容器内容
有时候在线上使用gdb调试程序core问题时,可能没有符号文件,拿到的仅是一个内存地址,如果这个指向的是一个STL对象,那么如何查看这个对象的内容呢?只需要知道STL各个容器的数据结构实现,就可以查看其内容。本文描述了SGI STL实现中常用容器的数据结构,以及如何在gdb中查看其内容。stringstring,即basic_string bits/basic_string.h:m原创 2014-12-03 22:09:31 · 2024 阅读 · 0 评论 -
linux动态库的种种要点
linux下使用动态库,基本用起来还是很容易。但如果我们的程序中大量使用动态库来实现各种框架/插件,那么就会遇到一些坑,掌握这些坑才有利于程序更稳健地运行。本篇先谈谈动态库符号方面的问题。测试代码可以在github上找到符号查找一个应用程序test会链接一个动态库libdy.so,如果一个符号,例如函数callfn定义于libdy.so中,test要使用该函数,简单地声明即可:原创 2014-11-04 00:57:12 · 4669 阅读 · 0 评论 -
浅析glibc中thread tls的一处bug
最早的时候是在程序初始化过程中开启了一个timer(timer_create),这个timer第一次触发的时间较短时就会引起程序core掉,core的位置也是不定的。使用valgrind可以发现有错误的内存写入:==31676== Invalid write of size 8==31676== at 0x37A540F852: _dl_allocate_tls_init (in /l原创 2014-10-07 21:36:12 · 4393 阅读 · 0 评论 -
浅析静态库链接原理
静态库的链接基本上同链接目标文件.obj/.o相同,但也有些不同的地方。本文简要描述linux下静态库在链接过程中的一些细节。静态库文件格式静态库远远不同于动态库,不涉及到符号重定位之类的问题。静态库本质上只是将一堆目标文件进行打包而已。静态库没有标准,不同的linux下都会有些细微的差别。大致的格式wiki上描述的较清楚:Global header-----------------原创 2014-09-15 22:48:21 · 8358 阅读 · 1 评论 -
C/C++中手动获取调用堆栈
当我们的程序core掉之后,如果能获取到core时的函数调用堆栈将非常有利于定位问题。在Windows下可以使用SEH机制;在Linux下通过gdb使用coredump文件即可。但有时候由于某些错误导致堆栈被破坏,发生拿不到调用堆栈的情况。一些基础预备知识本文不再详述,可以参考以下文章:函数调用栈的获取原理分析寄存器、函数调用与栈帧需要知道的信息:函数调用对应的call原创 2014-09-14 14:10:23 · 6677 阅读 · 0 评论 -
无锁有序链表的实现
无锁有序链表可以保证元素的唯一性,使其可用于哈希表的桶,甚至直接作为一个效率不那么高的map。普通链表的无锁实现相对简单点,因为插入元素可以在表头插,而有序链表的插入则是任意位置。本文主要基于论文High Performance Dynamic Lock-Free Hash Tables实现。主要问题链表的主要操作包含insert和remove,先简单实现一个版本,就会看到问题所在,以原创 2015-05-05 19:48:13 · 2803 阅读 · 4 评论