网络编程(15)——服务器如何主动退出

十五、day15

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

之前服务器的主函数如下

#include "CSession.h"
#include "CServer.h"int main()
{try {boost::asio::io_context ioc;CServer s(ioc, 10086);ioc.run();}catch (std::exception& e) {std::cerr << "Exception: " << e.what() << '\n';}boost::asio::io_context io_context;
}

有两种修改方式,第一种基于condition_variable和lock_quit;第二种基于asio库

1)第一种实现方式

#include "CSession.h"
#include "CServer.h"
#include <csignal>
#include <thread>
#include <mutex>bool bstop = false;
std::condition_variable cond_quit;
std::mutex mutex_quit;void sig_handler(int sig) {if (sig == SIGINT or sig == SIGTERM) {std::unique_lock<std::mutex> lock_quit(mutex_quit);bstop = true;cond_quit.notify_one();}
}int main()
{try {boost::asio::io_context ioc;std::thread net_work_thread([&ioc] { // 使用子线程运行网络服务CServer s(ioc, 10086);ioc.run();});// 主线程执行以下操作// 捕获信号,并执行信号对应的回调函数signal(SIGINT, sig_handler);signal(SIGTERM, sig_handler);// 循环会占用资源,为了防止占用资源我们选择挂起while (!bstop) {std::unique_lock<std::mutex> lock_quit(mutex_quit);cond_quit.wait(lock_quit);}ioc.stop();net_work_thread.join();}catch (std::exception& e) {std::cerr << "Exception: " << e.what() << '\n';}boost::asio::io_context io_context;
}
  • 条件变量、关服标志、锁必须都是全局变量

  • 自定义关服回调函数sig_handler一旦捕获到SIGINT(Ctrl+C触发)或SIGTERM(终止进程信号),系统调用sig_handler函数。在回调函数内首先进行加锁,以免重复操作,然后将关服标志位置为true,并将主线程唤醒,'}'结束后自动解锁

  • 启动子线程运行网络服务

  • 主线程种设置信号处理函数并将主线程挂起,等待退出信号(循环会占用cpu资源,这里通过挂起避免循环,节省资源)

  • 当主线程被唤醒后,退出循环,执行ioc.stop()来停止io_context,并将子线程中的ioc.run()返回

  • net_work_thread.join()确保子线程在主线程退出之前先结束运行,防止资源泄露

注:信号处理是异步的,即使主线程在等待条件变量,也可以被信号打断,执行信号处理函数

2)第二种实现方式

int main()
{try {boost::asio::io_context ioc;boost::asio::signal_set signals(ioc, SIGINT, SIGTERM);// 必须异步等待,否则建立线程进行处理signals.async_wait([&ioc](auto, auto) {ioc.stop();});CServer s(ioc, 10086);ioc.run();}catch (std::exception& e) {std::cerr << "Exception: " << e.what() << '\n';}boost::asio::io_context io_context;
}

第二种方式是我推荐的,最优雅最简单。

主要通过asio库的signal_set 函数执行信号处理操作,允许用户在指定的io_context 上异步等待这些信号的到来,并在信号到达时执行相应的回调

  • 异步处理: 通过将信号处理与 io_context 结合,程序能够继续处理其他异步任务,而不需要在信号到达时阻塞主线程。

  • 多线程支持: 如果程序使用多线程,信号的处理仍然可以有效地协调各个线程的操作。

3)测试

两种方式均能得到以下测试结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1557899.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

电影《749局》路演 苗苗演绎超能力少女分享幕后故事

近日&#xff0c;国庆档科幻电影《749局》正在热映中&#xff0c;各主创们以及导演正在积极路演中&#xff0c;截至目前&#xff0c;主演苗苗已到过宁波、杭州、武汉、长沙等城市&#xff0c;在现场与观众热情互动&#xff0c;讲述电影拍摄背后的故事与感受。根据猫眼专业版数据…

Word转PDF的转换方法有哪些?这7个效率技巧,不知道就亏大了!

Word转PDF怎么转&#xff1f;我们在日常工作生活中&#xff0c;经常会用到word文档。如果是编写报告、做会议记录、制定文案等内容&#xff0c;一般都会选择创建word文档。但是如果需要发送给同事、客户或合作伙伴协作时&#xff0c;pdf格式会更加方便。 那么如何将word转为pdf…

Chapter06

6.3.1 &#xff08;1&#xff09;打印如下图案 #include <stdio.h> int main() {int i, j;int n 5; // 定义图案的行数 for (i 1; i < n; i) {// 打印前导空格 for (j 1; j < n - i; j) {printf(" ");}// 打印数字 for (j 1; j < i; j) {p…

永磁同步电机环路反步法(backstepping)控制

文章目录 1、反步控制原理1.1 李雅普诺夫稳定性定理1.2 严格反馈系统1.3 一般设计流程 2、永磁同步电机反步控制2.1 反步控制器设计2.2 反步控制仿真 参考 写在前面&#xff1a;本人能力、时间、技术有限&#xff0c;没有对一些细节进行深入研究和分析&#xff0c;也难免有不足…

【Canvas与艺术】古典绿墙象牙白框红棱六边形窗格

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>古典六边形窗格Draft1</title><style type"text/css&q…

YOLOv10改进策略【注意力机制篇】| CVPR2024 CAA上下文锚点注意力机制

一、本文介绍 本文记录的是基于CAA注意力模块的YOLOv10目标检测改进方法研究。在远程遥感图像或其他大尺度变化的图像中目标检测任务中&#xff0c;为准确提取其长距离上下文信息&#xff0c;需要解决大目标尺度变化和多样上下文信息时的不足的问题。CAA能够有效捕捉长距离依赖…

嵌入式 c 内存堆栈增长方向往低地址方向好处

如下是堆和栈内存空间使用方式有如下好处&#xff1a; 1、stack从高地址向低地址扩展&#xff0c;这样栈空间的起始位置就能确定下来&#xff1b;如果反向&#xff0c;则要考虑这个起点从哪里合适&#xff0c;要确定堆的大小。 2、可以共用中间部分区域空间&#xff0c;最大化…

高速电路中电源设计问题

DCDC芯片都有一个开关频率&#xff0c;选型的时候注意一点这个问题。 纹波&#xff1a;纹波是电源波动中的低频部分&#xff0c;一般处于5Mhz以内的频段&#xff0c;铲子来自MOS的开关动作。 噪声&#xff1a;噪声值电源波动的高频部分&#xff0c;一般高于5Mhz,成分比较复杂…

UE5运行时动态加载场景角色动画任意搭配-角色及动画(一)

通过《MMD模型及动作一键完美导入UE5》系列文章,我们可以把外部场景、角色、动画资产导入UE5,接下来我们将实现运行时动态加载这些资产,并任意组合搭配。 1、骨骼动画复用 1、大部分模型骨骼是不通用的,比如这些裙子也是有骨骼的,属于模型特有的,但是对于动画来说,很多…

OmniCorpus数据集:最大(百亿级别)多模态数据集

2024-06-12 &#xff0c;由上海人工智能实验室、哈尔滨工业大学、南京大学、复旦大学等联合创建OmniCorpus&#xff0c;一个达到百亿级别的图文交错数据集。它不仅规模空前&#xff0c;更以其多元化的数据来源和高质量的数据内容&#xff0c;为多模态大语言模型的研究提供了坚实…

Axure大屏可视化模板在多领域实践应用案例分析

Axure大屏可视化模板&#xff0c;凭借其强大的功能性和灵活性&#xff0c;在众多领域中发挥着举足轻重的作用。本文将详细探讨Axure大屏可视化模板在农业、园区管理、智慧城市、企业数据可视化和医疗领域的应用案例&#xff0c;展示其如何助力各行业实现智能化管理和决策优化。…

Mythical Beings:Web3游戏如何平衡创造内容、关注度与实现盈利的不可能三角

Web3游戏自其诞生以来&#xff0c;以去中心化和独特的代币经济体系迅速引起关注。然而&#xff0c;如何在创造内容、吸引用户和实现盈利之间达到平衡&#xff0c;始终是Web3游戏面临的核心挑战。Mythical Beings作为一款Web3卡牌游戏&#xff0c;通过创新设计和独特机制&#x…

【LeetCode: 1436. 旅行终点站 | 哈希表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

面试题:Redis(一)

1. redis是单线程还是多线程&#xff1f; 2. IO多路复用听说过么&#xff1f; 3. Redis为什么快&#xff1f; 1. Redis是单线程还是多线程&#xff1f; 版本不同&#xff0c;Redis基于的架构也不同&#xff0c;所以单单问是单还是多线程并不严谨 3.x 之前 redis都是单线程 4.x …

微知-如何临时设置Linux系统时间?(date -s “2024-10-08 22:55:00“, time, hwclock, timedatectl)

背景 在tar解压包的时候经常出现时间不对&#xff0c;可以临时用date命令修改一下&#xff0c;也可以其他&#xff0c;本文主要介绍临时修改的方法 date命令修改 sudo date -s "2024-10-08 22:55:00"其他查看和修改的命令 本文只记录查看方式&#xff0c;修改的暂…

【java数据结构】ArrayList实例

【java数据结构】ArrayList实例 一、杨辉三角二、打扑克 一、杨辉三角 已知条件&#xff1a;给定行数的大小 思路&#xff1a;首先定义一个二维列表&#xff08;也可以称为集合&#xff09;&#xff0c;我们对每一列处理完&#xff0c;最后把每一列加起来&#xff0c;不就是完整…

某象异形滑块99%准确率方案

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 该文章模型已经上线ocr识别网站,欢迎测试!!,地址:http://yxlocr.nat300.top/ocr/slider/6 所谓的顶象异形滑块,是指没有采用常规的缺口,使用各种形状的缺口…

国外电商系统开发-运维系统文件上传-高级上传

如果您要上传文件到10台服务器中&#xff0c;有3台服务器的路径不是一样的&#xff0c;那么在这种情况下您就可以使用本功能&#xff0c;单独执行不一样的路径 点击【高级】上传

仿真技术入门书籍:《模拟集成电路设计与仿真》(可下载)

无论是在通信、医疗、消费电子还是工业控制领域&#xff0c;模拟集成电路都是实现复杂电子系统功能的关键。在电子工程领域&#xff0c;模拟集成电路设计是一门深奥而复杂的学科。随着技术的发展&#xff0c;设计者们需要掌握的不仅是电路设计原理&#xff0c;还包括仿真技术的…

【C语言刷力扣】1436.旅行终点站

题目&#xff1a; 解题思路&#xff1a; 两层循环查找&#xff0c;第一次循环中初始化 destination 为 path中每次旅行的终点作为最终的终点。二次循环查找当前 destination &#xff0c;若是作为某次旅行的起点&#xff0c;说明不是最后的终点。 char* destCity(char ***paths…