線程基本操作 (4)線程清理函數(shù)
類似于進程的atexit()
在線程運行完之后,如果想要在線程退出時,執(zhí)行某個操作.
就可以用到線程清理函數(shù).
與進程不同的是,線程可以注冊多個清理函數(shù).
這些清理函數(shù)會記錄在線程的棧中.
棧是先進后出.所以注冊順序和執(zhí)行順序是相反的.
下面是添加和移除清理函數(shù)的函數(shù):
pthread_cleanup_pop()可以清除棧中最頂層的,也就是最后添加的清理函數(shù).
觸發(fā)線程清理函數(shù)執(zhí)行的條件:
1,線程調(diào)用了pthread_exit()退出時;
2,線程響應(yīng)了取消請求時;
3,用非0參數(shù)調(diào)用pthread_cleanup_pop();
(pthread_cleanup_pop()的參數(shù)如果傳入的是0,那么清理函數(shù)不會被調(diào)用,而是被移除; 如果參數(shù)為非0,那么就會調(diào)用清理函數(shù);)
pthread_clean_push()和pthread_cleanup_pop()雖然是函數(shù),但是他們是用宏實現(xiàn)的.
其中分別包含 { 和 },所以兩個"函數(shù)"需要成對實現(xiàn).

例子:
對上面代碼進行編譯,
編譯方法一:可以使用 gcc -o main main.c -lpthread
編譯方法二:可以使用make,(前提是編寫一個makefile)

運行結(jié)果:

標簽: