zoukankan      html  css  js  c++  java
  • boost::asio::detail::epoll_reactor::start_op的崩溃问题

    在对程序进行压力测试时发现,程序有概率会在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连接进行关闭操作。

  • 相关阅读:
    使用java中的注解@see
    MacOS软件默认安装路径
    学习MACD指标
    go CD 用虚拟机快速增加一个新agent
    git推送本地分支到远程分支
    git如何切换远程仓库
    git命令查看远程分支
    Java 学习札记(一)JDK安装配置
    Oracle 基本操作符
    C# 常用控件属性及方法介绍
  • 原文地址:https://www.cnblogs.com/ruizhang3/p/6418269.html
Copyright © 2011-2022 走看看