Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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)传播到C++;11线_C++_Multithreading_C++11_Signals - Fatal编程技术网

C++ 将信号(SIGINT)传播到C++;11线

C++ 将信号(SIGINT)传播到C++;11线,c++,multithreading,c++11,signals,C++,Multithreading,C++11,Signals,我正在尝试在接收到SIGINT信号(^C)时正确终止我的多线程C++11应用程序,但由于某些原因,它不会传播到子线程,尽管主线程对此响应良好 对于instnce(如下面的代码示例),如果我们在线程内部有一个阻塞函数(如sleep()),那么如果您使用sigaction()函数安装了任何SIGNT钩子,它将从您那里取出所有^C控件 有没有办法修复或解决这种行为? 是否有方法将接收到的主信号传播到子线程 编辑:将POSIXsleep()替换为C++11std::this\u thread::slee

我正在尝试在接收到SIGINT信号(
^C
)时正确终止我的多线程C++11应用程序,但由于某些原因,它不会传播到子线程,尽管主线程对此响应良好

对于instnce(如下面的代码示例),如果我们在线程内部有一个阻塞函数(如
sleep()
),那么如果您使用
sigaction()
函数安装了任何SIGNT钩子,它将从您那里取出所有
^C
控件

有没有办法修复或解决这种行为? 是否有方法将接收到的主信号传播到子线程

编辑:将POSIX
sleep()
替换为C++11
std::this\u thread::sleep\u for()

#包括
#包括
#包括
#include//for sigaction()函数
静态int信号=0;
void_foo(){
当(!发出信号){
//现在按^C不会导致正确的终止,因为我们
//长时间睡眠(100500秒)且不响应
//由于一些棘手的原因,我正在寻找一个旁路。
标准时间:秒持续时间(100500);
std::this_thread::sleep_for(持续时间);
}
标准::cout
我正在尝试在接收到SIGINT信号(^C)时正确终止我的多线程C++11应用程序,但由于某些原因,它不会传播到子线程,尽管主线程对此响应良好

.在任何一种情况下,只有一个线程接收信号:

在生成时,应确定信号是为进程还是为进程内的特定线程生成的。应为导致生成信号的线程生成由特定线程的某些操作(如硬件故障)生成的信号至少生成与流程ID或流程组ID关联的事件,或应为流程生成异步事件,如终端活动

…为进程生成的信号应正好传递给进程中的一个线程,该线程正在调用选择该信号的sigwait()函数,或者尚未阻止信号的传递。如果调用sigwait()中没有线程函数选择该信号,如果进程中的所有线程都阻止了信号的传递,则该信号应在进程上保持挂起状态,直到线程调用选择该信号的sigwait()函数、线程取消阻止信号的传递,或者与该信号相关联的操作被设置为忽略该信号为止

在多线程进程中,一个常见的解决方案是阻止一个线程以外的所有线程中要处理的进程信号。一个线程通常会处理所有进程信号,并告诉其他线程要做什么(例如终止)

此外,由于信号处理程序设置了
信号化
,因此应将其声明为
易失性
,这是为以下目的引入的两个用例之一
易失性

static int volatile signaled = 0;

为什么要将POSIX
sleep
函数与C++11线程混合使用?只是为了举例,在实际应用程序中,它是ZeroMQ send()函数,具有完全相同的效果。事实上,这是一个糟糕的示例,我应该使用
std::this_thread::sleep_for()
取而代之。对不起,让我更正我的示例。您的回答提出了两个新问题:1)如何在C++11中中断线程,因此所有睡眠()s将唤醒?2)如何使用C++11资源清册终止线程?@AlexanderTumin我建议不要中断线程,因为您可能使用的第三方库可能无法正确处理中断。礼貌地告诉您的线程终止,然后等待。这假设您的所有线程都有某种事件循环,以便通知它们终止。您可以将sleep()替换为对条件变量的定时等待。然后,您可以在希望所有线程停止“睡眠”时向它们广播使用<代码> Value在这里是不正确的。请参见“<代码> STD::原子< /代码>或<代码> STD::原子< /代码>信号标志。@ NaNeNNSTST见C++ 2003<1.9。9:当抽象机器的处理被信号接收中断时,具有不同类型的SiggAuthMixIt以外的对象的值为UNSP。如果已指定,则处理程序修改的任何非易失性sig_-atomic_t对象的值都将变为未定义。要在此处进行说明,应使用
sig_-atomic_t
而不是
int
,但是,在Linux平台上
sig_-atomic_t
int
static int volatile signaled = 0;