線程 (4)線程清理函數(shù)
進(jìn)程中有一個函數(shù) atexit() ,使用它可以注冊進(jìn)程終止處理函數(shù).
當(dāng)調(diào)用 exit() 退出的時(shí)候,就會執(zhí)行進(jìn)程終止處理函數(shù).
線程也有一個類似的功能,叫做"線程清理函數(shù)"( thread cleanup handler).
線程的清理函數(shù)可以注冊多個(進(jìn)程只能注冊一個).
每個線程都擁有一個清理函數(shù)棧,這些函數(shù)都記錄在棧中,棧是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu).
也就是它們執(zhí)行順序與注冊順序相反.當(dāng)執(zhí)行完所有的清理函數(shù)后,線程終止.
那么,如何向線程的棧中添加和刪除"清理函數(shù)".

這個清理函數(shù)設(shè)置好了,
就等線程退出后,觸發(fā)執(zhí)行了.
下面幾種情況下,"清理函數(shù)"會被觸發(fā)執(zhí)行:
1,線程調(diào)用 pthread_exit() 退出時(shí);
2,線程響應(yīng)取消請求時(shí);
3,用非0參數(shù)調(diào)用 pthread_cleanup_pop();

舉例:
雖然 pthread_cleanup_push() 和 pthread_cleanup_pop() 都定義成了函數(shù)形式,
但是,其都是宏定義, 類似于括號{ }的左右邊,所以這兩個需要配合成對使用!!!
需要成對使用,最好編程的時(shí)候要在一個函數(shù)里,成對調(diào)用,分開用,就容易丟...

運(yùn)行代碼:
可以編寫一個makefile 或者直接 gcc執(zhí)行.
1,直接gcc執(zhí)行:

2,另一種執(zhí)行方法 : 編寫 makefile 然后 make
makefile內(nèi)容:
執(zhí)行效果:


pthread_cleanup_push() 和 pthread_cleanup_pop()
雖然有點(diǎn)類似鉤子函數(shù),
但比鉤子函數(shù)好的是,可以進(jìn)行干預(yù),可以取消某個.在pop中傳入(0)就不會調(diào)用.
如果不成對,就會報(bào)錯,
報(bào)錯可能會出現(xiàn)在main的結(jié)尾處或者開始處的大括號部分.
如果是這樣,絕大多數(shù)是因?yàn)檎Z法錯誤.比如分號錯誤,大括號不匹配.
為什么這兩個函數(shù)是宏,可以用 gcc main.c -E 查看上述代碼,就可以看到預(yù)處理后的代碼.
-E就是展開的意思...