当线程在c中调用longjmp()时会发生什么

Que*_*ble 2 c multithreading pthreads thread-safety

longjmp当你有一个用 C 语言调用的线程时会发生什么。我知道,当程序位于单线程上时,它PC会被放回到创建时的地址jmp_buf,并且处理器的寄存器会恢复到该时间点。

  1. 如果asetjmp在线程内部被调用,然后再longjmp被调用,一切可能就OK了?
  2. 如果setjmp在任何线程存在之前调用 ,然后一个线程调用longjmp该线程,它会杀死所有其他线程吗,因为它们在创建jmp_buf时不存在?jmp_buf

Jon*_*ler 6

相关函数的 POSIX 规范可以在以下位置找到:

\n\n\n\n

请注意,规范longjmp()列出了一些限制:

\n\n
\n

该函数应使用相应的参数恢复同一进程中longjmp()最近调用所保存的环境。如果最近一次对 的相应调用发生在另一个线程中,或者如果不存在此类调用,或者如果包含调用的函数在此期间已终止执行,或者如果 的调用在标识符的范围内可变修改的类型和执行期间已离开该范围,行为未定义。[CX] \xe2\x8c\xa6 未指定 longjmp() 是否恢复信号掩码、保持信号掩码不变或将其恢复为调用 setjmp() 时的值。\xe2\x8c\xabsetjmp()jmp_bufsetjmp()jmp_bufsetjmp()setjmp()

\n
\n\n

对于您的场景:

\n\n
    \n
  1. 应该可以。
  2. \n
  3. 未定义的行为。相反,如果主线程(或调用 的线程setjmp())执行longjmp(),则应该没问题,但它不会杀死其他线程。即使如此,您也可能会违反一般限制longjmp()
  4. \n
\n\n

总体而言,要明智且非常保守。它们是脆弱的功能。除非确实必要,否则不要使用它们,并且一般要担心资源管理。

\n