关于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个线程,如果同时操作共享内存,加锁肯定延迟其他线程,而发送是因为在一个线程里面所有可以直接发送 两个线程依赖另一个线程的数据,这样中间就搞一个队列类似的,其实就像一个池子,一个线程往里面放水,另一个线程从里面抽水,类似缓冲,效率也高了

转载于:https://www.cnblogs.com/zzyoucan/p/4103879.html

livevent的几个问题相关推荐

  1. memcached部署

    第1章 memcached 1 memcached前言 1.1 memcached诞生的原因 2003年诞生了memcached Web1.0 2005以前  企业提供内容为主. Web2.02005 ...

  2. Memcache 笔记

    自己以前笔记,和大家分享 一.Memcache概述 出现的原因:随着数据量的增大,访问的集中,使得数据库服务器的负担加重,数据库响应恶化,网站显示延迟等 memcache:是高性能的分布式内存缓存服务 ...

  3. 基于centos5.8源码安装nginx之LNMP

    LNMP 指的是什么呢,这里可以"望文生义",其是linux  NGINX  Mysql  PHP的组合.每一种工具的安装都有其特长来吸引我们去使用它,对此就要了解其组合的各个工具 ...

  4. libevent源码深度剖析三

    libevent源码深度剖析三 --libevent基本使用场景和事件流程 张亮 1 前言 学习源代码该从哪里入手?我觉得从程序的基本使用场景和代码的整体处理流程入手是个不错的方法,至少从个人的经验上 ...

  5. android+ndk+libevent,android ndk 编译 libevent

    1. 下载 libevent 2.1.8 版本 2. 先在 win10 上用 wsl ubuntu 编译 libevent 3. 在 wsl 上,准备需要的编译环境sudo apt-get insta ...

  6. 【C/C++服务器开发】文件,文件描述符,I/O多路复用,select / poll / epoll 详解

    文章目录 一.前言 1.文件的概念 2.文件描述符和文件指针 文件描述符 文件描述符和文件指针的区别 文件描述符太多了怎么办 二.I/O多路复用 1.I/O多路复用的由来 不要打电话给我,有需要我会打 ...

  7. libevent 源码分析丨libevent组件构成以及编程要领

    1,前言 Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不少.写这一系列文章的用意在于,一则分享心得:二则对libevent代码和设计思想做系统的.更深层次的分析, ...

最新文章

  1. pandas 官方API
  2. X光、CT、核磁、B超的区别,讲得太到位了
  3. 机器学习新算法更好描述量子系统模型
  4. java基础--集合Connection/Map
  5. PySide教程:一个简单的点击“.NET研究”按钮示例
  6. 自学Java和Java培训班的学习效果
  7. Shell for循环
  8. 微软云打印将直接与 OneDrive 集成;全球 90 多家组织敦促苹果放弃引入”儿童安全”功能计划……...
  9. 无法解析 uafxcw.lib_二级建造师《实务科目》推荐知识点习题,附中业网校答案解析...
  10. (28)状态机概述(第6天)
  11. 2019湖南职高计算机总分是多少,2019湖南高职单招一般多少分能过
  12. LeetCode(118)——杨辉三角(JavaScript)
  13. 打印机驱动冲突和端口异常:win10更新部分补丁后,打印机本地连接(连接打印机的主机)可以打印,其他共享网络中的电脑可以连接到打印机,但不能打印——解决方案...
  14. Android运行时权限,设置帮助类BaseActivity;电话权限,短信权限,
  15. 避免jQuery名字冲突--noConflict()方法
  16. VR 游戏开发资料收集
  17. textarea中输入多个空格或者换行时只显示一个空格的解决办法
  18. 【MB051】炫酷BAT代码 ① 装神系列→可参考
  19. 股票语音播报软件 炒股语音实时播报
  20. 计算机蓝屏一直重启,笔记本电脑开机蓝屏不断重启问题的解决方法

热门文章

  1. 如何提升鸿蒙战绩,蛰伏一年 鸿蒙系统2.0为我们带来了哪些升级?
  2. 托管系统的mysql设计_PHP+MySQL托管中心管理系统的设计与实现
  3. python怎么引入thrift文件_python使用thrift教程的方法示例
  4. 用python开启相机_使用“打开”编辑相机设置
  5. AI辅助构建知识图谱:关系抽取
  6. 如何配置神经网络中的层数和节点数
  7. java的位桶是什么_Java关于桶排序的知识点总结
  8. lacp静态和动态区别_静态人脸识别和动态人脸识别有哪些区别
  9. python 优先队列_Python Queue队列实现线程通信
  10. 计算机三角函数习惯原创的音乐,三角函数 UNIT版