博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost::asio::detail::epoll_reactor::start_op的崩溃问题
阅读量:4456 次
发布时间:2019-06-08

本文共 663 字,大约阅读时间需要 2 分钟。

在对程序进行压力测试时发现,程序有概率会在boost::asio::detail::epoll_reactor::start_op上面奔溃

尤其是在并发数较高的情况下。

查看boost中epoll_reactor.ipp中的源码,对奔溃处的逻辑进行分析后发现其基本逻辑如下:

对于每个socket链接,在程序调用停止函数对socket对象进行关闭或者销毁时

会在reactive_socket_service_base::destroy/close调用epoll_reactor::deregister_descriptor函数

注销相应的descriptor

在注销时,首先会判断descriptor_data是否为空,若为空则直接返回,若不为空则使用mutex进行加锁。

之后,使用descriptor_data中的shutdown_字段判断是否是已关闭状态。

若正常便进行相应处理逻辑。在处理完成之后会将descriptor_data置为空。

 

那么问题就在于在多线程高并发的情况,判断descriptor_data是否为空和加锁这一步骤中,descriptor_data可能会被其他线程置为空

导致之后使用descriptor_data中的shutdown_字段判断时,造成segment fault。使得该函数不是线程安全的函数。

解决方案:使用mutex使得不同线程不会同时对一个socket连接进行关闭操作。

转载于:https://www.cnblogs.com/ruizhang3/p/6418269.html

你可能感兴趣的文章
LeetCode - Combination Sum
查看>>
屏幕旋转,ViewController触发事件
查看>>
响应重定向和请求转发
查看>>
java例程练习(File类)
查看>>
Linux && 与 ||
查看>>
Python configparser模块
查看>>
解决Eclipse每次修改完代码后需要先Clean,不然部署不上文件的问题
查看>>
.gitignore无效,不能过滤某些文件
查看>>
特征选取
查看>>
mysql 数据类型
查看>>
使用面向对象的技术创建高级 Web 应用程序
查看>>
《大型网站技术架构:核心原理与案例分析》阅读笔记六
查看>>
一笔画问题---欧拉定理
查看>>
友元函数友元类
查看>>
CCParallaxNode
查看>>
python_xrange和range的异同
查看>>
WinForm中TreeView控件实现鼠标拖动节点(可实现同级节点位置互换,或拖到目标子节点)...
查看>>
服务器在多机状态下实现流的形式下载
查看>>
第2章 安装Nodejs Nodejs基础 课程介绍
查看>>
一维码:EAN-13码的识别
查看>>