2016-11-22 52 views
0

Advanced Programming in the UNIX Environment (3rd Edition),11.5,线程终止读到这样的:如果我们在U​​nix中返回pthread_cleanup_push和pthread_cleanup_pop之间会发生什么?为什么?

如果我们运行在FreeBSD或Mac OS X相同的程序,我们看到 课程会发生分段违例和下降的核心。出现这种情况是因为 在这些系统中,pthread_cleanup_push作为一个 宏保存在栈上的一些背景下实施。当线程1在通话之间 返回pthread_cleanup_push和调用 pthread_cleanup_pop,堆栈覆盖,这些平台尝试 时调用清理 处理程序来使用这个(现在的损坏)上下文。在单一UNIX规范,返回而匹配的一对 之间的呼叫到pthread_cleanup_push和未定义的行为 pthread_cleanup_pop结果。在这两个函数之间返回的唯一便携式 的方法是调用pthread_exit。

所以,我想知道什么是在栈上所谓的上下文,什么是覆盖和损坏的上下文,以及为什么返回不能按预期工作?

回答

1

当调用C函数时,它会在内存的“堆栈”部分存储一些信息(如局部变量)。同样,当这个函数调用另一个函数时,这个新函数在调用函数之后存储它的信息。

当函数调用结束时,它的内存被释放/释放,类似于从堆栈中取出一块板。这个空间现在可以重用。

memory http://www.firmcodes.com/wp-content/uploads/2014/08/memory.png

如果pthread_cleanup_push被作为存储在栈上的信息(上下文)的宏实现,该存储器将被free'd,并有可能被下一个函数调用覆盖。

如果发生这种情况pthread_cleanup_pop被调用之前,有一个很好的机会,“背景”,将已经被连续的函数调用覆盖从而破坏内存pthread_cleanup_pop期待从中读取数据。

+0

“这个内存将被释放,并可能被下一个函数调用覆盖”,这是不正确的,但是这是否会因为分割违规而终止进程?我认为pthread_cleanup_pop将读取损坏的内存,它的行为将变得不可预测,但不会被终止。你怎么看? – cong

相关问题