Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
适当关闭多线程c++;接收SIGINT操作时的应用程序 我用Socket制作了一个多线程C++应用程序。 换句话说,我有很多对象要关闭(例如我的服务器套接字、关闭线程等)_C++_Signals - Fatal编程技术网

适当关闭多线程c++;接收SIGINT操作时的应用程序 我用Socket制作了一个多线程C++应用程序。 换句话说,我有很多对象要关闭(例如我的服务器套接字、关闭线程等)

适当关闭多线程c++;接收SIGINT操作时的应用程序 我用Socket制作了一个多线程C++应用程序。 换句话说,我有很多对象要关闭(例如我的服务器套接字、关闭线程等),c++,signals,C++,Signals,我通常从main()函数的末尾开始关闭所有内容,但当我的应用程序用户按Ctrl+C时,我无法以适当的方式关闭所有内容 顺便说一下,我可以将所有实例保持为static,然后在静态函数中通过处理SIGINT信号来关闭它们,但这对我来说并不合适,因为我有很多实例要关闭 我正要用sigaction或signal通过捕获发送所有实例,但它无法编译 signal(SIGINT, [myInstance](int) { myInstance.close() }; 实际上,将实例添加到匿名函数会捕获签名的更改

我通常从main()函数的末尾开始关闭所有内容,但当我的应用程序用户按Ctrl+C时,我无法以适当的方式关闭所有内容

顺便说一下,我可以将所有实例保持为
static
,然后在静态函数中通过处理
SIGINT
信号来关闭它们,但这对我来说并不合适,因为我有很多实例要关闭

我正要用sigaction或signal通过捕获发送所有实例,但它无法编译

signal(SIGINT, [myInstance](int) { myInstance.close() };
实际上,将实例添加到匿名函数会捕获签名的更改,并使其不再是函数


有没有其他合适的方法来完成我想要的任务?

用事件驱动的内核编写程序

这个事件驱动的内核通常花时间无所事事,等待新的事件


当您接收到SIGINT时,只需与事件驱动的内核通信信号已经到达。然后让它完全关闭并退出main。

使用事件驱动内核编写程序

这个事件驱动的内核通常花时间无所事事,等待新的事件


当您接收到SIGINT时,只需与事件驱动的内核通信信号已经到达。然后让它完全关闭并退出main。

首先,看看boost::asio,如果您还没有。这是一个伟大的图书馆,使网络更容易。 至于你的问题:面向对象的设计可能会给你很多帮助。不要直接使用套接字API。但是,如果没有关于您的应用程序或您的背景的任何更具体的信息(示例、片段),就很难推荐任何特定的内容。以下是一些想法:

捕获SIGINT然后终止应用程序与在主函数中使用while循环等待按键没有太大区别。这只是结束应用程序的另一种方式

编写一个服务器类。编写一个连接类。在堆上实例化新连接并使用共享的\u ptr(使用make\u shared)。保留活动连接对象的列表。为迭代这些对象并关闭它们的服务器类编写关闭方法。在main中为每个侦听套接字实例化一个服务器对象(这样您就可以轻松地拥有一个双堆栈应用程序,在IP4上侦听,在IP6套接字上侦听)。每个服务器有一个单独的线程,每个连接有一个线程(注意:当同时有数百个或数千个活动连接时,这会很慢)

学习boost::asio示例。有一些很好的例子可以满足你的需要。另外,正如另一个答案正确地表明的那样,boost::asio可以作为“事件驱动的核心”工作

尽可能多地使用RAII(资源获取是初始化)


当您捕获到SIGINT时,只需调用server::shutdown即可。

首先,如果您还没有看到boost::asio,请查看一下。这是一个伟大的图书馆,使网络更容易。 至于你的问题:面向对象的设计可能会给你很多帮助。不要直接使用套接字API。但是,如果没有关于您的应用程序或您的背景的任何更具体的信息(示例、片段),就很难推荐任何特定的内容。以下是一些想法:

捕获SIGINT然后终止应用程序与在主函数中使用while循环等待按键没有太大区别。这只是结束应用程序的另一种方式

编写一个服务器类。编写一个连接类。在堆上实例化新连接并使用共享的\u ptr(使用make\u shared)。保留活动连接对象的列表。为迭代这些对象并关闭它们的服务器类编写关闭方法。在main中为每个侦听套接字实例化一个服务器对象(这样您就可以轻松地拥有一个双堆栈应用程序,在IP4上侦听,在IP6套接字上侦听)。每个服务器有一个单独的线程,每个连接有一个线程(注意:当同时有数百个或数千个活动连接时,这会很慢)

学习boost::asio示例。有一些很好的例子可以满足你的需要。另外,正如另一个答案正确地表明的那样,boost::asio可以作为“事件驱动的核心”工作

尽可能多地使用RAII(资源获取是初始化)

当您捕获SIGINT时,只需调用server::shutdown。

我假设您在Linux(或其他POSIX系统)上

然后仔细阅读和(在Linux上,C++11-s是在pthreads之上实现的)。还可以阅读POSIX和一些

请注意,信号和线程不能很好地结合在一起

一个众所周知的技巧是在初始化时设置一些(到self),让信号处理程序在该管道上运行,并让您处理该管道的输入和调用它。甚至Qt在其页面中也提出并解释了这一点

您可能想要使用(不是),并且需要提供一个原始函数(不是一些
std::function
或lambda表达式)-最好是
extern“C”
一个(以确保编译器正在为您的信号处理程序使用C调用约定)

<>您可以考虑使用Linux特定的.< /P>(对于<代码> SigINT/COM>和<代码> SigTale<代码> > 您可能更愿意避免处理信号,并使用其他功能(可能在上面,或者使用诸如或之类的HTTP服务器库,使您的应用程序成为a)来请求您的程序轻轻终止。

我假设您在Linux(或其他POSIX系统)上

然后仔细阅读和(在Linux上,C++11-s是在pthreads之上实现的)。还可以阅读POSIX和一些

请注意,信号和线程不能很好地结合在一起

一个众所周知的技巧是在初始化时设置一些(到self),并让您的信号处理程序