我在Advanced Programming in the UNIX Environment (3rd Edition),11.5,线程终止中了解了这一点:
如果我们在FreeBSD或Mac OS X上运行相同的程序,则会看到
程序会导致分段违规并导致核心中断。有时候是这样的
因为在这些系统上,pthread_cleanup_push被实现为
在堆栈上存储一些上下文的宏。当线程1返回时
在对pthread_cleanup_push的调用与对的调用之间
pthread_cleanup_pop,堆栈被覆盖,这些平台尝试
在调用清理时使用此(现在已损坏)上下文
处理程序。在《单一UNIX规范》中,在
对pthread_cleanup_push和
pthread_cleanup_pop导致未定义的行为。唯一的便携式
在这两个函数之间返回的方法是调用pthread_exit。
那么,我想知道什么是堆栈上的所谓上下文,什么是被覆盖和损坏的上下文,以及为什么return不能按预期工作?
最佳答案
调用C函数时,它将一些信息(如局部变量)存储在内存的“堆栈”部分中。同样,当此函数调用另一个函数时,此新函数将在调用函数之后存储其信息。
当函数调用结束时,它的内存被释放/释放,类似于将板从堆栈中取出。现在可以重复使用该空间。
memory http://www.firmcodes.com/wp-content/uploads/2014/08/memory.png
如果pthread_cleanup_push
被实现为在堆栈上存储信息(上下文)的宏,则该内存将被释放,并可能被下一个函数调用覆盖。
如果在调用pthread_cleanup_pop
之前发生这种情况,则很有可能该“上下文”将被连续的函数调用覆盖,从而损坏了pthread_cleanup_pop
希望读取的内存。
关于c - 如果我们在Unix中的pthread_cleanup_push和pthread_cleanup_pop之间返回会怎样?又为什么呢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40732877/