免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3848 | 回复: 6
打印 上一主题 下一主题

[C++] 谁熟悉libevent库呀,我卡在evbuffer_get_length里啦 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-08 18:21 |只看该作者 |倒序浏览
本帖最后由 jd808 于 2015-01-08 18:24 编辑
  1. 读aa===1147  //这个下面就是evbuffer_get_length(m_ReadBuf);这个,有libevent提供,读取缓存长度.卡在这个函数了
  2. close event. fd:1147, Bev:0x96bb10, conn:0x96d910 ==140737354020672
  3. ============准备关闭句柄==============1===fd:1147
复制代码
这里有个奇怪的地方是,读线程在准备读取长度的时候卡主了(libevent里应该有吧锁),但这个时候主线程抛出了这个fd断开了,就调用关闭程序取关闭fd和缓存.由于读线程加了conn->UserCMDLock锁(保证每个句柄只能一个线程在读),为了保证在读取过程中,不关闭FD,我就在关闭函数里又加了conn->UserCMDLock锁,结果就卡主了.(关闭函数只会在主线程调用,不会和读线程冲突,这里卡主主要是读线程被卡在了evbuffer_get_length处,导致读线程不能释放锁.),请问这种情况是BUG?还是我用的不对啊.

我的结构是,主线程初始化libevent和fd接入,以及读取消息通知,工作线程通过主线程的管道,接收fd通知,在通过fd取读取消息(读取过程由libevent提供的缓存自动完成,我只读取缓存里面的消息)

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
2 [报告]
发表于 2015-01-08 22:51 |只看该作者
gdb的bt信息是啥样子的?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2015-01-09 14:30 |只看该作者
ilex 发表于 2015-01-08 22:51
gdb的bt信息是啥样子的?

gdb的bt消息不准确,因为这个卡主后,线程管道那边立即就卡主了,没法往里写数据(测试的时候数据发送非常快),所以gdb的bt消息通常都是提示管道被卡主,实际是libevent被卡主了

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
4 [报告]
发表于 2015-01-12 11:28 |只看该作者
但这个时候主线程抛出了这个fd断开了

——是怎么发现fd断开了?主动关闭还是libevent告诉你的?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2015-01-12 16:59 |只看该作者
ilex 发表于 2015-01-12 11:28
但这个时候主线程抛出了这个fd断开了

——是怎么发现fd断开了?主动关闭还是libevent告诉你的?
libevent告诉我的.

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
6 [报告]
发表于 2015-01-13 09:02 |只看该作者
看起来是两把锁,两个线程互相在等对方的锁。
evbuffer_get_length(const struct evbuffer *buffer)
{
        size_t result;

        EVBUFFER_LOCK(buffer);

        result = (buffer->total_len);

        EVBUFFER_UNLOCK(buffer);

        return result;
}
这个函数在等evbuffer的锁,
还有一个锁就是你自己定义的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2015-01-13 09:35 |只看该作者
ilex 发表于 2015-01-13 09:02
看起来是两把锁,两个线程互相在等对方的锁。
evbuffer_get_length(const struct evbuffer *buffer)
{
我对另外一个线程的发送代码做啦调整,以前是遍历句柄链表发送消息出去(每个都发),并且忘记加锁了,现在加了个锁,好像没这个问题了,感觉好奇怪,即使句柄被关闭或者删除,也不能出现这个长度不能读取吧.无法理解.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP