关于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;
}不加锁
std::vector<TcpLinkEx*> g_TcpLinkExs;//这个好像是针对机器人用的吧
TcpLinkEx* g_curTcpLinkEx;//当前连接的用户
对于这一块加锁,我看不明白咋加的
6.
//auto cur_fd = c->m_bev->ev_write.ev_fd;
/**
* [说明]:因为是异步读写,bufferevent_write将写入事件丢进工作线程的事件列表中
* 可能存在此主线程在调用bufferevent_free的时候,将套接字关闭(即:主线程立马关闭套接字),
* 而下一瞬间工作线程从激活队列中取出此处的写入事件发给客户端时,这个时候,发现此套接字无效,
* select的时候发现对无效套接字进行操作,立刻报错!所以需要保证操作的套接字有效
*/
过程这样的,主线程去写,子线程收到断开事件,主线程延迟释放等待子线程操作相关套接字的数据
7.为什么接受用内存池,然后无锁队列,而发送时直接发送
因为是4个线程,如果同时操作共享内存,加锁肯定延迟其他线程,而发送是因为在一个线程里面所有可以直接发送
两个线程依赖另一个线程的数据,这样中间就搞一个队列类似的,其实就像一个池子,一个线程往里面放水,另一个线程从里面抽水,类似缓冲,效率也高了

livevent的几个问题的更多相关文章

  1. libevent源码深度剖析

    原文地址: http://blog.csdn.net/sparkliang/article/details/4957667 第一章 1,前言 Libevent是一个轻量级的开源高性能网络库,使用者众多 ...

  2. Nginx+Tomcat+Memcached负载均衡集群服务搭建

    操作系统:CentOS6.5  本文档主要讲解,如何在CentOS6.5下搭建Nginx+Tomcat+Memcached负载均衡集群服务器,Nginx负责负载均衡,Tomcat负责实际服务,Memc ...

  3. 【转】开源C/C++网络库比较

    在开源的C/C++网络库中, 常用的就那么几个, 在业界知名度最高的, 应该是ACE了, 不过是个重量级的大家伙, 轻量级的有libevent, libev, 还有 Boost的ASIO. ACE是一 ...

  4. Windows下Memcached在.Net程序中的实际运用(从Memcached客户端Enyim的库的编译到实际项目运用)

    1.一点基础概念 2.获取EnyimMemcached客户端的源代码并编译出动态库 3.Memcached的服务器安装(windows server) 4.在web项目中实战 一.基础概念 memca ...

  5. 开源C/C++网络库比较

    在开源的C/C++网络库中, 常用的就那么几个, 在业界知名度最高的, 应该是ACE了, 不过是个重量级的大家伙, 轻量级的有libevent, libev, 还有 Boost的ASIO. ACE是一 ...

  6. Nginx+Tomcat7+Mencached负载均衡集群部署笔记

    Nginx+Tomcat+Memcached负载均衡集群服务搭建 操作系统:CentOS6.5 本文档主要解说,怎样在CentOS6.5下搭建Nginx+Tomcat+Memcached负载均衡集群s ...

  7. Libevent库学习笔记

    Libevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,Libevent在底层select.pool.kqueue和epoll等机制基础上,封装出一致的事件接口.可 ...

  8. centos7上安装zabbix4.0

    zabbix4.0已经推出有一段时间了,针对之前版本做了很多优化配置,易用性得到提高,特别lts(long team support)长技术支持版本,官方说提供5年的稳定技术支持,在商业化运用上,是比 ...

  9. libevent学习笔记(参考libevent深度剖析)

    最近自学libevent事件驱动库,参考的资料为libevent2.2版本以及张亮提供的<Libevent源码深度剖析>, 参考资料: http://blog.csdn.net/spark ...

随机推荐

  1. 生成不重复随机数,int转 TCHAR 打印输出

    在0~n 中 随机去除不重复的k个数 int k=100; int n=80000; for(int i=0;k>0&&i<n;i++) { if((bigrand()%( ...

  2. EF 只更新部分字段

    /// 只更新storedAddress数据中的DefaultAddress字段,更新为false /// 将默认地址改为不是默认地址 /// </summary> /// <par ...

  3. Ubuntu 下安装 Oracle JDK

    sudo add-apt-repository ppa:webupd8team/javasudo apt-get updatesudo apt-get install oracle-java8-ins ...

  4. 如何在windows下安装python第三方包

    python安装第三方库一般方式和easy_install方式 2010-06-24 17:43:53|  分类: Python |  标签:python  |字号 订阅     python安装第三 ...

  5. rails笔记

    rake -T 列出全部taskconfig.active_record.schema_format = :sql #remove the old db/schema.rb file, create ...

  6. xcode plugin

    http://alcatraz.io/ https://github.com/macoscope/CodePilot prepo  curl -fsSL https://raw.githubuserc ...

  7. JS中的函数,Array对象,for-in语句,with语句,自定义对象,Prototype

    一)函数 A)JS中的函数的定义格式: function add(a,b) { var sum = a+b; document.write("两个数的和是:" + sum); // ...

  8. jquery 小知识点

    //计算checkbox有多少个被选中 $("input[name='user_apply']:checked").length)://可以查看 所有的name=user_appl ...

  9. shelll函数求两个输入数字之和

    #!/bin/bash #This is a test of the addition of the program! function AddFun { read -p "Enter a ...

  10. 使用工厂bean和Utility Schema定义集合

    工厂bean是实现了beanFactory接口的bean,也可以继承AbstractFactoryBean,主要是用于在给定属性参数之后自动创建一个bean对象. 我们在使用基本集合标记定义集合时,不 ...