Que*_*ble 2 c multithreading pthreads thread-safety
longjmp当你有一个用 C 语言调用的线程时会发生什么。我知道,当程序位于单线程上时,它PC会被放回到创建时的地址jmp_buf,并且处理器的寄存器会恢复到该时间点。
setjmp在线程内部被调用,然后再longjmp被调用,一切可能就OK了?setjmp在任何线程存在之前调用 ,然后一个线程调用longjmp该线程,它会杀死所有其他线程吗,因为它们在创建jmp_buf时不存在?jmp_buf相关函数的 POSIX 规范可以在以下位置找到:
\n\nlongjmp()setjmp()siglongjmp()sigsetjmp()请注意,规范longjmp()列出了一些限制:
\n\n\n该函数应使用相应的参数恢复同一进程中
\nlongjmp()最近调用所保存的环境。如果最近一次对 的相应调用发生在另一个线程中,或者如果不存在此类调用,或者如果包含调用的函数在此期间已终止执行,或者如果 的调用在标识符的范围内可变修改的类型和执行期间已离开该范围,行为未定义。[CX] \xe2\x8c\xa6 未指定 longjmp() 是否恢复信号掩码、保持信号掩码不变或将其恢复为调用 setjmp() 时的值。\xe2\x8c\xabsetjmp()jmp_bufsetjmp()jmp_bufsetjmp()setjmp()
对于您的场景:
\n\nsetjmp())执行longjmp(),则应该没问题,但它不会杀死其他线程。即使如此,您也可能会违反一般限制longjmp()。总体而言,要明智且非常保守。它们是脆弱的功能。除非确实必要,否则不要使用它们,并且一般要担心资源管理。
\n