我是靠谱客的博主 等待钢笔,最近开发中收集的这篇文章主要介绍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连接进行关闭操作。

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

最后

以上就是等待钢笔为你收集整理的boost::asio::detail::epoll_reactor::start_op的崩溃问题的全部内容,希望文章能够帮你解决boost::asio::detail::epoll_reactor::start_op的崩溃问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部