手册上说,setitimer在整个进程中是共享的,SIGPROF是发送给进程的,而不是线程。
但是,当我在多线程进程中创建计时器时,除非我为进程中的每个线程创建独立的堆栈来处理signo,否则我将在sig处理程序中得到一些非常严重的错误。通过一些调试,我确认堆栈(唯一的堆栈情况)必须是重新输入的。
所以现在我怀疑SIGPROFs可能同时被发送到多线程?谢谢!
发布于 2011-03-31 13:35:53
我不听你的问题的细节,但一般情况是:
可以为整个进程(例如,使用pthread_kill(2)发送时)或特定线程(例如,由于执行特定的机器语言指令而产生的某些信号,例如SIGSEGV和SIGFPE )产生信号,因为信号是针对使用(3)的特定线程而产生的。可以将进程定向信号传递到当前没有阻止该信号的任何线程。如果多个线程解除了信号阻塞,那么内核将选择一个任意线程来传递信号。 man (7)信号
您可以用σ掩模阻止特定线程的信号,并通过消除将其定向到您想要处理的线程。
发布于 2011-04-29 03:05:18
根据POSIX,使用sigaltstack建立的备用信号堆栈是每个线程,而不是由新线程继承的而不是。但是,我相信某些版本的Linux和/或用户空间p线程库代码(至少是带有LinuxThreads的旧内核,也许也有一些带有NPTL的版本?)在继承备用堆栈的地方有一个bug,这当然会导致当您使用备用堆栈时崩溃。你需要备用堆栈有什么原因吗?通常,唯一的目的是半优雅地处理堆栈溢出(允许自己在某个堆栈位置捕获SIGSEGV并在退出之前保存任何未保存的数据)。我只想让它失效。
或者,使用pthread_sigmask在除主线程之外的所有线程中阻塞SIGPROF。注意,为了避免在这里出现令人讨厌的争用条件,您需要在调用pthread_create之前在主线程中阻塞它,以便新线程以阻塞开始,在pthread_create返回后解除阻塞。
https://stackoverflow.com/questions/5499414
复制相似问题