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 ...
随机推荐
- kvm介绍
KVM(Kernel-Based Virtual Machines)是一个基于Linux内核的虚拟化技术, 可以直接将Linux内核转换为Hypervisor(系统管理程 序)从而使得Linux内核能 ...
- 使用虚拟机在ubuntu下搭建mongoDB开发环境和简单增删改查操作
最近在折腾mongodb和nodejs,在imooc上找了一个mongodb的入门教程,跟着里面一步一步的走,下面记录下我操作的步骤和遇到的问题. 课程地址:http://www.imooc.com/ ...
- android任意view爆炸效果--第三方开源--ExplosionField
犹如天女散花一样,爆炸散列,比较有趣.Android ExplosionField在github上的项目主页是:https://github.com/tyrantgit/ExplosionField ...
- Service(一)----->简单计算
xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...
- htaccess rewrites重写规则实例
1..htaccess rewrite实例开始部分 Options +FollowSymLinksRewriteEngine OnRewriteBase / 2.把不带www的域名地址重定向到带www ...
- 2.html5的基本格式
分享完html语言的核心之后,是时候开始写了.理论上,只要符合格式要求,就算是用记事本也可以写.但是,这种蛋疼且生产力低下的行为还是少做的好,选一个适合自己的IDE才是上上之选,至于哪个合适自己,那就 ...
- Python脚本控制的WebDriver 常用操作 <十二> send_keys模拟按键输入
下面将使用WebDriver中的send_keys来模拟键盘按键输入 测试用例场景 send_keys方法可以模拟一些组合键操作: ctrl+a ctrl+c ctrl+v 等. 另外有时候我们需要在 ...
- webpack 学习笔记 02 快速入门
webpack 的目标 将依赖项分块,按需加载. 减少web app的初始加载时间. 使每一个静态集合都能够作为组件使用. 有能力集成第三方库,作为组件使用. 高度可配置化. 适用于大型项目. INS ...
- hdu 1702 ACboy needs your help again!
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1702 ACboy needs your help again! Description ACboy w ...
- 鲁棒性是 Robustness
鲁棒性是 Robustness 的音译,是指当系统受到不正常干扰时,是否还能保证主体功能正常运作.可参考 维基百科:http://zh.wikipedia.org/zh/ 鲁棒性 _( 计算机科学 ) ...