首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setitimer的ITIMER_PROF(SIGPROF)是否发送到多线程、NPTL和Linux(2.6.21.7)中的每个线程?

setitimer的ITIMER_PROF(SIGPROF)是否发送到多线程、NPTL和Linux(2.6.21.7)中的每个线程?
EN

Stack Overflow用户
提问于 2011-03-31 11:55:34
回答 2查看 2K关注 0票数 5

手册上说,setitimer在整个进程中是共享的,SIGPROF是发送给进程的,而不是线程。

但是,当我在多线程进程中创建计时器时,除非我为进程中的每个线程创建独立的堆栈来处理signo,否则我将在sig处理程序中得到一些非常严重的错误。通过一些调试,我确认堆栈(唯一的堆栈情况)必须是重新输入的。

所以现在我怀疑SIGPROFs可能同时被发送到多线程?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2011-03-31 13:35:53

我不听你的问题的细节,但一般情况是:

可以为整个进程(例如,使用pthread_kill(2)发送时)或特定线程(例如,由于执行特定的机器语言指令而产生的某些信号,例如SIGSEGV和SIGFPE )产生信号,因为信号是针对使用(3)的特定线程而产生的。可以将进程定向信号传递到当前没有阻止该信号的任何线程。如果多个线程解除了信号阻塞,那么内核将选择一个任意线程来传递信号。 man (7)信号

您可以用σ掩模阻止特定线程的信号,并通过消除将其定向到您想要处理的线程。

票数 3
EN

Stack Overflow用户

发布于 2011-04-29 03:05:18

根据POSIX,使用sigaltstack建立的备用信号堆栈是每个线程,而不是由新线程继承的而不是。但是,我相信某些版本的Linux和/或用户空间p线程库代码(至少是带有LinuxThreads的旧内核,也许也有一些带有NPTL的版本?)在继承备用堆栈的地方有一个bug,这当然会导致当您使用备用堆栈时崩溃。你需要备用堆栈有什么原因吗?通常,唯一的目的是半优雅地处理堆栈溢出(允许自己在某个堆栈位置捕获SIGSEGV并在退出之前保存任何未保存的数据)。我只想让它失效。

或者,使用pthread_sigmask在除主线程之外的所有线程中阻塞SIGPROF。注意,为了避免在这里出现令人讨厌的争用条件,您需要在调用pthread_create之前在主线程中阻塞它,以便新线程以阻塞开始,在pthread_create返回后解除阻塞。

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

https://stackoverflow.com/questions/5499414

复制
相关文章

相似问题

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