我在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 - 如果我们在U​​nix中的pthread_cleanup_push和pthread_cleanup_pop之间返回会怎样?又为什么呢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40732877/

10-15 04:53
查看更多