gpt4 book ai didi

c - 如果我们在 Unix 中的 pthread_cleanup_push 和 pthread_cleanup_pop 之间返回会发生什么?为什么?

转载 作者:行者123 更新时间:2023-11-30 15:03:26 26 4
gpt4 key购买 nike

我在Advanced Programming in the UNIX Environment (3rd Edition)中读到了这一点,11.5,线程终止:

If we run the same program on FreeBSD or Mac OS X, we see that the program incurs a segmentation violation and drops core. This happens because on these systems, pthread_cleanup_push is implemented as a macro that stores some context on the stack. When thread 1 returns in between the call to pthread_cleanup_push and the call to pthread_cleanup_pop, the stack is overwritten and these platforms try to use this (now corrupted) context when they invoke the cleanup handlers. In the Single UNIX Specification, returning while in between a matched pair of calls to pthread_cleanup_push and pthread_cleanup_pop results in undefined behavior. The only portable way to return in between these two functions is to call 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com