Hiredis 在多线程中使用的坑,请教各位

冰点123 发布于 2017/09/04 08:39
阅读 314
收藏 1

我前面提到过一次关于hiredis在多线程中报core错误的问题,后来看了很多关于它的介绍说必须要每个线程中创建一个hiredis句柄来使用就会解决问题,我照做了,后来也似乎解决了问题,但是在运行一段时间后我发现问题并没有解决,依然报core崩溃,有没有哪位入过此坑的,麻烦指点一下迷津,hiredis在多线程模式下究竟要怎么应用?

补充一下代码截图,报异常的是在 位置1的地方,sigsegv 应该是内存越界了,而引起这个问题的,应该是在2这个位置,不知道有没有出同样错误的。

 

以下是问题补充:

@冰点123:原因目前是找到了,存在两个问题,一个realloc的第一个参数传递了一个已经被free掉的内存地址。最终问题是redisContext的obuf这个指针一直在使用realloc频繁变更。作者标注的redisContext非线程安全,应该也是这个东西引起的。 (2017/09/04 17:29)
@冰点123:obuf 实际是一个写入缓冲区,在给它指定内容之前所做的操作就是指令组装,最终使用是在redisBufferWrite函数里面,那么我是不是可以将这里改造一下,预先分配一块固定的缓冲区比如1k长度,然后一个context就对应这一个写入缓冲区就好,这样频繁的内存申请就可以避免了,也不存在越界或者无权限的内存。 (2017/09/04 17:39)
@冰点123:其实我没有弄懂作者使用sds这个类的意图,难道就是为了能动态扩展内存? 难道作者就没有考虑到频繁修改内存带来的问题? 还是根本我就没弄懂作者这么写的真正意图!求教! (2017/09/04 17:57)
加载中
0
冰点123
冰点123

这么多人看都没一个回复的,是没人用过这东西?

0
k
ktprime

hiredis客户端不是线程安全的, 一致再多线程下使用每个线程独立一个handle没问题, 每次操作检查连接是否OK

冰点123
冰点123
是的,我现在就改到每个线程独立handle的,但是仍然偶发性的报core问题,我用gdb跟踪后看报的位置基本都是在对sds里面realloc的时候
0
星辰大海88
星辰大海88

 

没用过,换了吧

冰点123
冰点123
换哪套,我的应用是纯linux c的
返回顶部
顶部