首页 > 代码库 > livevent的几个问题

livevent的几个问题

关于libevent的几个问题1.他到底是如何保证这个套接字有效的主线程去断开关闭套接字,主线程去调用buffwrite,在子线程收到客户端断开时,主线程延迟1分钟释放,这样保证子线程操作完该socket的操作但其实我没有真正理解这样搞怎么就能保证安全性2.BUFFEREVENT_WRITE到底还是主线程在发送数据,这个和四个子线程什么关系发现四个子线程还只是负责读取客户端和socket错误的数据,发送还是在主线程完成的3. * [测试]:先解锁再加锁,防止此线程在分配内存失败的时候死循环等待时,main_thread的send_data陷入阻塞。void Channel::read_datastream(struct bufferevent* bev){    size_t len = bufferevent_read(bev, m_buf, sizeof(m_buf));/** * [测试]:先解锁再加锁,防止此线程在分配内存失败的时候死循环等待时,main_thread的send_data陷入阻塞。 */        evbuffer_unlock(bev->output);     //auto& in = bev->input;    lock一样    //auto& out = bev->output;    m_readStream.Push(m_buf, len);    //这个为什么先解锁在加锁,是因为对于bufferevent操作会自动加锁的,而这里read_pack从内存池分配内存    //有可能某个类型的用完了会造成等待的状态,而此时主线程的buffwrite去加锁会出现等待的状态,这样是不行的    //所以这里先加锁再解锁    read_pack();    evbuffer_lock(bev->output);}//这边有个小疑问,就是这个锁到底用的哪种同步方式,难道也必须是先解锁在加锁,这个是必须的吗4.这都到客户端这层了,还能判断发送到那个客户端吗auto link = g_TcpLinkExs[channel_id];5.那种多线程回调不是太懂,有的加锁,有的不加bool NGP::OnDisconnected(){    m_queFunctions.push(std::bind(&NGP::Disconnected, this));    return true;}不加锁6.auto cur_fd = c->m_bev->ev_write.ev_fd;/** *    [说明]:因为是异步读写,bufferevent_write将写入事件丢进工作线程的事件列表中 *        可能存在此主线程在调用bufferevent_free的时候,将套接字关闭(即:主线程立马关闭套接字), *        而下一瞬间工作线程从激活队列中取出此处的写入事件发给客户端时,这个时候,发现此套接字无效, *        select的时候发现对无效套接字进行操作,立刻报错!所以需要保证操作的套接字有效 */ 7.为什么接受用内存池,然后无锁队列,而发送时直接发送

 

livevent的几个问题