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 ...
随机推荐
- web.xml中的url-pattern映射规则
Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单.servlet和filter中的url-pattern有一些文章在里面的,总结了一些东西,以免遇到问题又要浪费时间. 一,s ...
- Java ZK image 處理
自己上 ZK 官方論壇提問.別人的回答.自己解決問題後上傳的問題紀錄: http://forum.zkoss.org/question/101152/how-do-i-binding-image-fi ...
- 利用HttpWebRequest访问WebApi
WebApi现在越来越流行,下面给出利用HttpWebRequest访问WebApi的工具方法: 1.利用基准URL和参数字典生成完整URL /// <summary> /// 生成URL ...
- C# 平时碰见的问题【2】
问题1 修改命名空间后 .ashx 类型创建失败 [情景] 在调整前后台项目结构的时候,修改了默认命名空间(XXX.Admin 修改成XXX.Web),结果调试的时候发现XXX.Admin.Ajax. ...
- MarkDown写作技巧
前言 年轻的我们往往苦恼于没有充实的社会经历.社会阅历,很难有较强的个人能力.个人魅力!就个人能力而言,本 人主要把它分为两种:“吸收能力”和“输出能力”.吸收能力主要体现了个人对外界知识的摄入能力, ...
- 【Django】Apache上运行多个Django项目
运行单个项目的步骤参考:这里 1 安装环境 操作系统:Ubuntu 12.04 LTS 32 位(安装在VMware虚拟机中) python 版本: Python 2.7.3 Django版本 > ...
- python 序列的方法
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在快速教程中,我们了解了最基本的序列(sequence).回忆一下,序列包含有定值 ...
- DB2数据库之间联邦
现在有以下两个数据库:sample,QIN 需要在数据库QIN中访问sample中的表ACT 1.数据库编目 C:\Users\QIN>db2 catalog tcpip node OLIVER ...
- Redbean:入门(三) - Exec 以及 Query 以及 ConvertToBeans
<?php //引入rb入口文件 include_once 'rb.php'; //定义dsn以及相关的数据 $dsn = 'mysql:host=localhost;dbname=hwibs_ ...
- 九度oj 1407 快速找出最小数
原题链接:http://ac.jobdu.com/problem.php?pid=1407 线段树,区间更新,查询区间最小值. 注意区间更新,查询的时候,区间$\begin{align*}[L,R] ...