3
回答
Hiredis 在多线程中使用的坑,请教各位
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

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

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

 

<无标签>
举报
冰点123
发帖于3个月前 3回/131阅

以下是问题补充:

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