网络流程图

解释一下网络的调度过程
客户机连接:
服务器监听线程收到连接,轮询libevent线程,扔给轮询线程的连接队列中,向socketpair发送c一个字节,lib线程收到通知根据fd创建与客户机通信的bufferevent,然后将这样一个连接事件放入线程的状态改变队列(w2m_state_change_que)中
后面就是直接这个线程与客户机通信

通信发送数据
1.几个libevent线程都将讲数据放到一个无锁队列中这个没什么(这个是从客户端接收数据)
2.从服务器发送数据到客户端,在主线程里面send_data,然后放到线程信息的m2w_ask_que的中去,然后这个Lib线程自己去发送

断开连接
也是将状态变化放入w2m_state_change_que中


现在说说主线程的driver()操作
这个我认为是因为玩家的channel在一个线程去决定其是否有效是比较安全的
bool LibEvtServer::driver()
{
    bool has_post = false;
    ConnectState state_change;
    for (auto work_thread : m_libevent_threads)
    {
        while (work_thread->w2m_state_change_que.PopData(&state_change))
        {
            m_vec_channel_plt[state_change.m_channel_id] = 
                state_change.m_is_connect ? work_thread : NULL;
            has_post = true;
        }
    }
    return has_post;
}

经过这样改动,libevent线程就自己去管自己所属客户端的发送和接收数据,而主线程管连接是否有效,因为之前有这样一个问题,就是将玩家踢下线,不能理解将这个socket关闭,因为
关闭之后子线程有可能还去操作这个socket造成错误,说实话这个没看懂,恕我愚钝。。。
原文地址:https://www.cnblogs.com/zzyoucan/p/4343395.html