chyper2
2016-08-02 03:30
采纳率: 0%
浏览 2.4k

libevent多线程处理新手问题

小弟最近在做个项目
服务端:
主线程用event_base_dispatch(g_eventBase);阻塞掉
子线程负责从数据库中读数据发送bufferevent_write()
初始化如下
[code=c]

struct sockaddr_in sSvrAddr;

memset(&sSvrAddr, 0, sizeof (sSvrAddr));
try
{
    sSvrAddr.sin_family = AF_INET;
    sSvrAddr.sin_addr.s_addr = inet_addr(g_strListenIP.c_str());
    sSvrAddr.sin_port = htons(atoi(g_strListenPort.c_str()));
}
catch (...)
{
    LOGERROR(g_Log, ERROR_CODE_UNDEFINED, "系统启动失败!请检查IP/PORT是否设置正确! IP:%s PORT:%s",
             g_strListenIP.c_str(),g_strListenPort.c_str());
    exit(0);
}

// 新建Base事件
g_eventBase = event_base_new();    

evconnlistener *listener = 
        evconnlistener_new_bind(g_eventBase, listener_cb, g_eventBase,
                                  LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE|LEV_OPT_THREADSAFE,
                                  5, (struct sockaddr*) &sSvrAddr,
                                  sizeof (struct sockaddr_in));
evthread_use_pthreads();
event_base_dispatch(g_eventBase);

[/code]

listener_cb函数如下
[code=c]
struct sockaddr_in sCliAddr;
memcpy(&sCliAddr, sock, sizeof(sCliAddr));

//evutil_make_socket_nonblocking(iCliFd);
struct bufferevent* buf_ev;
buf_ev = bufferevent_socket_new(g_eventBase, iCliFd, BEV_OPT_CLOSE_ON_FREE|BEV_OPT_THREADSAFE);
bufferevent_setcb(buf_ev, readcb, NULL, errorcb, NULL);
bufferevent_enable(buf_ev, EV_READ | EV_WRITE);

[/code]

现在出现的问题是
过一段时间(不确定)就会出现所有的消息都无法触发任何callback函数,接收(进不了readcb函数)和发送消息(bufferevent_write返回成功加入,但是没有真正发出)也没有反应,但是调试跟踪代码时,发现还是在dispatch的循环中!请问是什么情况!

最新更新进展!我将bufferevent_write更新为write函数后,跑了几个小时了!目前没问题!应该是因为我只有一个线程涉及到了libevent,但是为什么啊!求教原因!

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • 鱼弦 2016-08-02 03:42

    dispatch 消息没法分发出去

    打赏 评论

相关推荐 更多相似问题