手册上说,setitimer在整个进程中是共享的,SIGPROF是发送给进程的,而不是线程。
但是,当我在多线程进程中创建计时器时,除非我为进程中的每个线程创建独立的堆栈来处理signo,否则我将在sig处理程序中得到一些非常严重的错误。通过一些调试,我确认堆栈(唯一的堆栈情况)必须是重新输入的。
所以现在我怀疑SIGPROFs可能同时被发送到多线程?谢谢!
发布于 2011-03-31 13:35:53
发布于 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
复制相似问题