首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >POSIX线程和信号

POSIX线程和信号
EN

Stack Overflow用户
提问于 2010-04-05 00:44:43
回答 4查看 31.8K关注 0票数 82

我一直在尝试理解POSIX线程和POSIX信号交互的错综复杂之处。我特别感兴趣的是:

  • 控制信号传递到哪个线程的最好方法是什么(假设它首先不是致命的)?
  • 告诉另一个线程(实际上可能很忙)信号已经到达的最佳方法是什么?(我已经知道从信号处理程序中使用pthread条件变量不是一个好主意。)
  • 如何安全地处理将信号已发生的信息传递给其他线程?这需要在信号处理程序中发生吗?(我一般不想杀死其他线程;我需要一种更微妙的方法。)

作为参考,我正在研究如何将TclX包转换为支持线程,或者如何拆分它,并至少使一些有用的部分支持线程。信号是其中一个特别有趣的部分。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-24 01:24:32

  • 控制将信号传递到哪个线程的最佳方法是什么?

正如@zoli2k所指出的,显式地指定一个线程来处理您希望处理的所有信号(或一组线程,每个线程都具有特定的信号职责)是一种很好的技术。

告诉另一个线程(实际上可能很忙)的最好方法是什么,告诉它信号已经发生了,我可以安全地处理将一个信号已经发生的信息传递给其他线程吗,arrived?...

  • How,,
  • ?这需要在信号处理程序中发生吗?

我不会说“最好的”,但这是我的建议:

阻塞main中所有所需信号,以便所有线程都继承信号掩码。然后,将特殊的信号接收线程设计成一个信号驱动的事件循环,将新到达的信号作为发送给其他线程内的通信

要做到这一点,最简单的方法是让线程使用sigwaitinfo or sigtimedwait在循环中接受信号。然后线程以某种方式转换信号,可能是广播一个pthread_cond_t,用更多的I/O唤醒其他线程,将命令排入特定于应用程序的线程安全队列中,等等。

或者,特殊线程可以允许将信号传递给信号处理程序,仅在准备好处理信号时才取消对传递的屏蔽。(然而,通过处理程序的信号传递往往比通过sigwait系列的信号接收更容易出错。)在这种情况下,接收器的信号处理程序执行一些简单的异步信号安全操作:设置sig_atomic_t标志,调用sigaddset(&signals_i_have_seen_recently, latest_sig),将一个字节的write()传递给非阻塞self-pipe,等等。然后,回到其屏蔽的主循环中,线程如上所述将信号的接收传递给其他线程。

(更新了 @caf,正确地指出sigwait方法更优越。)

票数 49
EN

Stack Overflow用户

发布于 2010-04-05 01:26:27

根据POSIX标准,所有线程在系统上都应该使用相同的PID,并且可以使用pthread_sigmask()为每个线程定义信号阻塞掩码。

由于每个PID只允许定义一个信号处理程序,因此我更喜欢在一个线程中处理所有信号,如果需要取消正在运行的线程,则发送pthread_cancel()。它是反对pthread_kill()的首选方式,因为它允许为线程定义清理函数。

在一些较旧的系统上,由于缺乏适当的内核支持,正在运行的线程的PID可能与父线程的PID不同。有关使用linuxThreads on Linux 2.4处理信号的信息,请参阅常见问题解答。

票数 15
EN

Stack Overflow用户

发布于 2010-04-08 04:48:32

到目前为止,我所处的位置:

  • 信号有不同的主要类别,其中一些通常只会终止进程(SIGILL),而另一些永远不需要做任何事情(SIGIO;不管怎样,只做异步IO更容易)。这两个类不需要动作。
  • 有些信号不需要立即处理;像SIGWINCH这样的类可以排队等待,直到它方便了(就像来自X11的事件一样)。
  • 那些棘手的信号是你想要通过中断正在做的事情来响应它们,但又不会影响到清除线程的程度。特别是,在交互模式下登录应该让事物具有响应性。

我仍然需要对POSIX、pselectsigwaitsigaltstack以及其他一大堆POSIX(和非POSIX)进行比较。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2575106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档