我Advanced Programming in the UNIX Environment (3rd Edition),11.5,線程終止讀到這樣的:如果我們在Unix中返回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。
所以,我想知道什麼是在棧上所謂的上下文,什麼是覆蓋和損壞的上下文,以及爲什麼返回不能按預期工作?
「這個內存將被釋放,並可能被下一個函數調用覆蓋」,這是不正確的,但是這是否會因爲分割違規而終止進程?我認爲pthread_cleanup_pop將讀取損壞的內存,它的行爲將變得不可預測,但不會被終止。你怎麼看? – cong