2016-11-22 22 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

相關問題