【问题标题】:Do threads continue executing when a signal arrives?信号到达时线程是否继续执行?
【发布时间】:2017-12-28 11:02:35
【问题描述】:

我正在用 C 语言编写一个多线程程序,其中 main() 会改变一些信号的行为,然后产生更多线程。问题是:其他线程是在信号到达时继续执行,还是在处理信号时暂停并恢复执行?

谢谢

【问题讨论】:

  • 不,其他线程没有暂停。但即使他们会被暂停,我认为这对你没有帮助。
  • 线程和信号之间的交互在 C 标准中是未定义的,因此没有通用的答案。请使用您正在使用的操作系统和/或线程标准标记您的问题。
  • 我正在使用 POSIX 线程和 Linux 4.4。另外,我不是在问如何暂停线程的执行,而是在问其他线程是否在信号到达时暂停,因为根据答案,我将不得不继续编程做一件事或另一件事.谢谢。
  • 如果线程都在同一个 CPU 上运行,那么它们会在信号处理程序运行时停止。如果它们都运行在不同的 CPU 上,那么只有接收信号的线程运行信号处理程序。

标签: c multithreading signals execution pause


【解决方案1】:

当信号到达时其他线程是否继续执行

在 Linux 上他们这样做是因为信号只传递给一个线程。除非信号是SIGSTOP,它会停止进程的所有线程。有关详细信息,请参阅 man signal(7)man pthreads(7)(忽略与旧线程实现相关的 LinuxThreads 信息)。

虽然 POSIX 不要求这样做,但这些细节是特定于操作系统的。

【讨论】:

  • 这不是特定于操作系统的,而是 POSIX 要求的,它清楚地指定了信号传递如何与线程交互以及信号处理程序中断接收信号的线程,而不是进程。
  • @R.. POSIX 规范确实指定了信号的生成和传递方式,是的。但是,它没有详细说明向一个线程传递信号如何影响其他执行线程(它不能影响其他线程)——没有这样的要求。
  • @R.. 换句话说,它可以在调用信号处理程序时停止所有线程,并且仍然是符合 POSIX 的实现,不是吗?
  • 没有。我不明白你认为你从哪里得到的。
  • @MaximEgorushkin: (1) 特定线程中的信号传递,以及 (2) 要求线程(在相同或不同进程中)表现得好像它们同时执行,即一个无法进行转发进步不会明显导致其他人无法取得进步。
猜你喜欢
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多