当前位置: 首页 > news >正文

Asio15-QuitGracefully

Asio15-QuitGracefully.md

服务器优雅退出一直是服务器设计必须考虑的一个方向,意在能通过捕获信号使服务器安全退出。我们可以通过asio提供的信号机制绑定回调函数即可实现优雅退出。在主函数中我们添加

int main()
{try {boost::asio::io_context  io_context;boost::asio::signal_set signals(io_context, SIGINT, SIGTERM);signals.async_wait([&io_context](const boost::system::error_code*error, int signal_number) {io_context.stop();});CServer s(io_context, 10086);io_context.run();}catch (std::exception& e) {std::cerr << "Exception: " << e.what() << endl;}
}

利用signal_set 定义了一系列信号合集,并且绑定了一个匿名函数,匿名函数捕获了io_context的引用,并且函数中设置了停止操作,也就是说当捕获到SIGINT,SIGTERM等信号时,会调用io_context.stop

也可以使用c风格的信号:

bool stop = false;
std::mutex mtx;
std::condition_variable cv;void sig_handle(int sig)
{if (sig == SIGINT || sig == SIGTERM) {std::unique_lock<std::mutex> lck(mtx);stop = true;cv.notify_one();}
}int main()
{try {boost::asio::io_context io_context;std::thread net_work_thread([&io_context]() {CServer s(io_context, 9999);io_context.run();});std::signal(SIGINT, sig_handle);std::signal(SIGTERM, sig_handle);std::cout << "sad" << std::endl;/*** std::unique_lock<std::mutex> lk(mtx);* while(!stop){*     cv.wait(lk); // 等信号* }*/{std::unique_lock<std::mutex> lk(mtx);cv.wait(lk, [] { return stop; }); // 等信号}io_context.stop();net_work_thread.join();} catch (std::exception& e) {std::cerr << "Exception: " << e.what() << endl;}}

区别在于,我们需要多开一个线程,用于支持服务的运行,主线程用于检测退出信号.

{std::unique_lock<std::mutex> lk(mtx);cv.wait(lk, [] { return stop; }); // 等信号
}std::unique_lock<std::mutex> lk(mtx);
while(!stop){cv.wait(lk); // 等信号
}

我们看到,这里对于等待条件变量两种写法,第一种是现代cpp支持的写法,cv.wait的第二个参数传入谓词,通过检测stop的值可以防止虚假唤醒.

第二种则是传统的使用方法,使用循环避免虚假唤醒.实际上第一种等价于第二种.

对于第二种,可能会写成如下形式:

while(!stop){std::unique_lock<std::mutex> lk(mtx);cv.wait(lk); // 等信号
}

这样在判断stop的时候没有加锁,那么与其他线程同时修改判断就会导致数据竞争,触发未定义.

如下情况,可能漏掉notify:

主线程:while (!stop) // 判断为 true,准备进入循环体 信号处理器:stop = true; cv.notify_one(); // 通知已发出 主线程:std::unique_lock<std::mutex> lk(mtx); cv.wait(lk); // 永远阻塞:通知已错过

http://www.gsyq.cn/news/149040.html

相关文章:

  • 基于Android的XX校园学习娱乐交流APP--论文小程序
  • 领导根本不关心你干了多少活,只在意这3点
  • 【课程设计/毕业设计】基于SpringBoot的植物知识分享系统的设计与实现基于SpringBoot的植物知识管理与分享平台的设计与实现【附源码、数据库、万字文档】
  • 手把手吃透设计模式内功:七大原则代码解析与重构指南
  • Elasticsearch倒排索引详解:如何实现高效搜索
  • excel如何筛选重复项?码住这4种方法!
  • Asio12-HandlePacketStickingProblemSimply
  • 第四章 SQL Server备份和还原
  • 【课程设计/毕业设计】基于springboot美发门店管理系统设计与实现基于springboot的美发商城系统【附源码、数据库、万字文档】
  • 计算机Java毕设实战-基于springboot的美发商城系统服务预约技师选择、到店时间预约【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 计算机Java毕设实战-基于SpringBoot的植物知识管理与分享平台的设计与实现家庭园艺种植分享平台设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 番茄小说下载器 2025.12.21 | 现代化、高效的番茄小说下载器,支持批量下载和多种格式导出
  • STM32平衡车工具-匿名助手+虚拟串口如何使用。
  • 计算机Java毕设实战-基于springboot+vue技术的二手车交易管理系统的设计与实现基于SpringBoot+Vue的二手车交易平台设计【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 2-[(2-叠氮乙酰基)氨基]-2-脱氧-D-吡喃甘露糖—糖生物学与代谢标记的关键化学探针 1971934-97-0
  • Java毕设选题推荐:基于springboot+vue技术的二手车交易管理系统的设计与实现汽车管理汽车品牌管理,公告类型管理,论坛管理【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 新品限免|国产大模型工程化实战:GLM-4.7与MiniMax M2.1 免费选型对比
  • Java毕设项目:基于springboot+vue技术的二手车交易管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • Java毕设选题推荐:基于Java的停车场管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • python自定义注解
  • 12/24第五章
  • python基于Vue的客户关系管理系统的设计与实现_3itcvt88
  • vue基于python的民宿房间预订推荐系统的设计与实现_7r8s9b63(pycharm django flask)
  • Pandoc转换Word文档:使用Lua过滤器统一调整Pandoc文档中的图片和表格格式
  • VFF-Net:一种取代反向传播的AI训练新算法
  • Java计算机毕设之基于Java的停车场管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • springboot-vue企业会议交换机设备维修批量运维管理系统 vue没论文py09
  • 数据库介绍
  • 【毕业设计】基于Java的停车场管理系统(源码+文档+远程调试,全bao定制等)
  • Java毕设项目:基于springboot的户外救援系统(源码+文档,讲解、调试运行,定制等)