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;
}不加锁
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的几个问题的更多相关文章
- libevent源码深度剖析
原文地址: http://blog.csdn.net/sparkliang/article/details/4957667 第一章 1,前言 Libevent是一个轻量级的开源高性能网络库,使用者众多 ...
- Nginx+Tomcat+Memcached负载均衡集群服务搭建
操作系统:CentOS6.5 本文档主要讲解,如何在CentOS6.5下搭建Nginx+Tomcat+Memcached负载均衡集群服务器,Nginx负责负载均衡,Tomcat负责实际服务,Memc ...
- 【转】开源C/C++网络库比较
在开源的C/C++网络库中, 常用的就那么几个, 在业界知名度最高的, 应该是ACE了, 不过是个重量级的大家伙, 轻量级的有libevent, libev, 还有 Boost的ASIO. ACE是一 ...
- Windows下Memcached在.Net程序中的实际运用(从Memcached客户端Enyim的库的编译到实际项目运用)
1.一点基础概念 2.获取EnyimMemcached客户端的源代码并编译出动态库 3.Memcached的服务器安装(windows server) 4.在web项目中实战 一.基础概念 memca ...
- 开源C/C++网络库比较
在开源的C/C++网络库中, 常用的就那么几个, 在业界知名度最高的, 应该是ACE了, 不过是个重量级的大家伙, 轻量级的有libevent, libev, 还有 Boost的ASIO. ACE是一 ...
- Nginx+Tomcat7+Mencached负载均衡集群部署笔记
Nginx+Tomcat+Memcached负载均衡集群服务搭建 操作系统:CentOS6.5 本文档主要解说,怎样在CentOS6.5下搭建Nginx+Tomcat+Memcached负载均衡集群s ...
- Libevent库学习笔记
Libevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,Libevent在底层select.pool.kqueue和epoll等机制基础上,封装出一致的事件接口.可 ...
- centos7上安装zabbix4.0
zabbix4.0已经推出有一段时间了,针对之前版本做了很多优化配置,易用性得到提高,特别lts(long team support)长技术支持版本,官方说提供5年的稳定技术支持,在商业化运用上,是比 ...
- libevent学习笔记(参考libevent深度剖析)
最近自学libevent事件驱动库,参考的资料为libevent2.2版本以及张亮提供的<Libevent源码深度剖析>, 参考资料: http://blog.csdn.net/spark ...
随机推荐
- php __clone需要注意的问题
当一个对象的属性是另外一个对象时,当有一个对象复制该对象时,当复制到这个属性(一个对象)时,只复制这个属性(对象)的引用,而不复制引用的对象. class Account{ public $bal ...
- php spl
最近在重构后台,自写rbac,发现自己在设计模式方面尤为欠缺,没有一个长远的目光,所以打算静下心来看一看自己平时不关注的功能,spl就是其中之一. spl是Standard PHP Library(P ...
- Spring中Quartz调度器的使用
一.Quartz的特点 * 按作业类的继承方式来分,主要有以下两种: 1.作业类继承org.springframework.scheduling.quartz.QuartzJobBean类的方式 2. ...
- RecyclerView的基本创建
线性显示 类似于listview: 线性宫格显示 类似于grid view: 用线性宫格显示 类似于瀑布流: 结构图: 测试代码: activity_main.xml: <RelativeLay ...
- Android Socket通信
1.TCP: xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...
- Win10下IIS配置图解、MVC项目发布图解、IIS添加网站图解
Win10下IIS配置 .找到控制面板:[开始]菜单鼠标右击,打开[控制面板] .打开控制面板,点击[程序],点击[启用或关闭Windows功能] 下一步,点击[启用虎关闭Windows功能] . 开 ...
- Java 第七天 动态代理
代理类需实现InvocationHandler接口: public interface InvocationHandler { public Object invoke(Object proxy,Me ...
- 第十四章 调试及安全性(In .net4.5) 之 对称及非对称加密
1. 概述 本章内容包括:对称及非对称加密算法..net中的加密类.使用哈希操作.创建和管理签名认证.代码访问权限 和 加密字符串. 2. 主要内容 2.1 使用对称和非对称加密 ① 对称加密:使用同 ...
- FineUI PK DWZ
一.概述 FineUI(ExtAspNet)是基于 jQuery / ExtJS 的 ASP.NET 控件库. DWZ是基于JQuery的一个客户端框架. 二.比较 三.总结 这两个东西实质都是对控件 ...
- StyleCop学习笔记——默认的规则
在StyleCop中有一些官方自己写好的检测规则下面就是英文的解释 文档规则 1.SA1600:ElementsMustBeDocumented元素必须添加注释 2.SA1601: PartialEl ...