gpt4 book ai didi

c++ - 多线程环境中的信号处理函数

转载 作者:IT老高 更新时间:2023-10-28 22:33:23 35 4
gpt4 key购买 nike

在我的多线程 GUI 应用程序中,我有以下信号处理代码。我想改进这段代码,使其正确且线程安全,但在信号处理中有些事情我并不完全理解:

  • 在进程或线程级别处理信号(我可以有线程特定的信号处理程序)吗?
  • signal_handler 函数在哪个线程上下文中执行?
  • 是否可以在短时间内发送多个 SIGTERM 信号?
  • 使用互斥锁来阻止 signal_handler 的并行执行是否有意义?

void signal_handler(int sig)
{
switch (sig)
{
case SIGTERM:
::wxLogMessage(wxT("SIGTERM signal received ..."));
break;
case SIGINT:
::wxLogMessage(wxT("SIGINT signal received ..."));
break;
case SIGUSR1:
::wxLogMessage(wxT("SIGUSR1 signal received ..."));
break;
default:
::wxLogMessage(wxT("Unknown signal received ..."));
}

// send wxCloseEvent to main application window
::wxGetApp().GetTopWindow()->Close(true);
}

我在我的 init 函数中注册了信号处理程序:

// register signal handlers
signal(SIGTERM, signal_handler);
signal(SIGINT, signal_handler);
signal(SIGUSR1, signal_handler);

最佳答案

  • 信号处理程序是每个进程的状态 - 也就是说,一个进程中的所有线程共享同一组已安装的信号处理程序函数。
  • 信号掩码是每个线程的状态。信号可以在每个线程的基础上被阻塞或解除阻塞。
  • 信号可以是进程导向的或线程导向的。如果信号是进程导向的,则选择当前没有阻塞信号类型的任意线程来处理它。

在多线程应用程序中处理信号的一种简单方法是创建一个线程作为专用的信号处理线程。所有感兴趣的信号在每个线程中都被阻塞;没有建立信号处理程序;并且信号处理线程在循环中调用 sigwaitinfo(),在收到信号时对其进行处理。

这意味着您不必担心要调用的函数是否是异步信号安全,因为信号不在信号处理程序中处理 - 它们是由您的专用信号处理线程同步处理,该线程可以调用它喜欢的任何函数(例如,它可以使用普通的 pthreads 同步函数来唤醒另一个线程)。

关于c++ - 多线程环境中的信号处理函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12952262/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com