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_buf
setjmp()
jmp_buf
setjmp()
setjmp()
对于您的场景:
\n\nsetjmp()
)执行longjmp()
,则应该没问题,但它不会杀死其他线程。即使如此,您也可能会违反一般限制longjmp()
。总体而言,要明智且非常保守。它们是脆弱的功能。除非确实必要,否则不要使用它们,并且一般要担心资源管理。
\n 归档时间: |
|
查看次数: |
2117 次 |
最近记录: |