国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

78-線程清理函數(shù)

2019-11-06 06:16:49
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

有時(shí)候我們希望線程退出時(shí)能夠自動(dòng)的執(zhí)行某些函數(shù),為了能達(dá)到此目的,OS 提供了兩個(gè)函數(shù)幫我們完成這個(gè)功能:

void pthread_cleanup_push(void (*rtn)(void*), void *arg);void pthread_cleanup_pop(int execute);

1. 使用方法

如果想要你的線程在退出時(shí)能夠執(zhí)行清理函數(shù),你需要使用 pthread_cleanup_push 對(duì)你的清理函數(shù)進(jìn)行注冊(cè),如下:

void clean(void *arg) { // ...}void *th_fn(void *arg) { // push 和 pop 必須對(duì)對(duì)出現(xiàn) pthread_cleanup_push(clean, // 清理函數(shù) clean 的參數(shù)); // ... pthread_cleanup_pop(1);}

linux 中,pthread_cleanup_pushpthread_cleanup_pop 這兩個(gè)函數(shù)是通過宏來(lái)做的,pthread_cleanup_push 被替換成以左花括號(hào) { 為開頭的一段代碼,而 pthread_cleanup_pop 被替換成以右花括號(hào) } 結(jié)尾的一段代碼,這就意味著這兩個(gè)函數(shù)必須要成對(duì)出現(xiàn)才能將左右花括號(hào)匹配上,否則就出現(xiàn)編譯錯(cuò)誤。

有些平臺(tái)可能不是使用宏來(lái)實(shí)現(xiàn),就算不成對(duì)也沒什么關(guān)系。

2. 線程清理函數(shù)調(diào)用時(shí)機(jī)

有三種情況線程清理函數(shù)會(huì)被調(diào)用:

線程還未執(zhí)行 pthread_cleanup_pop 前,被 pthread_cancel 取消線程還未執(zhí)行 pthread_cleanup_pop 前,主動(dòng)執(zhí)行 pthread_exit 終止線程執(zhí)行 pthread_cleanup_pop,且 pthread_cleanup_pop 的參數(shù)不為 0.

注意:如果線程還未執(zhí)行 pthread_cleanup_pop 前通過 return 返回,是不會(huì)執(zhí)行清理函數(shù)的。

3. 示例

3.1 程序清單

程序 clean 需要傳入兩個(gè)參數(shù),第 1 個(gè)參數(shù)表示是否提前返回(在執(zhí)行 pthread_cleanup_pop 前返回),第 2 個(gè)參數(shù)表示 pthread_cleanup_pop 的參數(shù)。所以有 4 種組合情況。

代碼// clean.c#include <unistd.h>#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define ERR(name,err) do{

這里寫圖片描述 圖1 運(yùn)行結(jié)果

3.2 結(jié)果分析

從圖 1 中的結(jié)果可以看到:

當(dāng) clean 程序中的線程正常返回時(shí),只有 pthread_cleanup_pop 的參數(shù)非 0 時(shí),才會(huì)正常執(zhí)行清理函數(shù)。當(dāng) clean 程序中的線程在執(zhí)行 pthread_cleanup_pop 前時(shí),使用 pthread_exit 退出時(shí),清理函數(shù)才會(huì)被執(zhí)行,和 pthread_cleanup_pop 的參數(shù)沒有關(guān)系。而使用 return 返回的線程 1 并不會(huì)執(zhí)行清理函數(shù)。清理函數(shù)的執(zhí)行順序,是按照注冊(cè)時(shí)候相反的順序執(zhí)行的。

注意,在有些系統(tǒng)中(FreeBSD/Mac OS X),提前終止可能會(huì)出現(xiàn)段錯(cuò)誤。

4. 總結(jié)

掌握線程清理函數(shù)的注冊(cè)方法知道在 Linux 中,push 函數(shù)和 pop 函數(shù)是通過宏實(shí)現(xiàn)的,使用時(shí)必須成對(duì)出現(xiàn)掌握清理函數(shù)的執(zhí)行時(shí)機(jī)

練習(xí):完成本文中的實(shí)驗(yàn),編譯運(yùn)行并查看結(jié)果。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 内乡县| 广丰县| 西吉县| 永仁县| 城口县| 六安市| 密云县| 泰和县| 德江县| 武汉市| 红原县| 高邮市| 淮安市| 利辛县| 甘南县| 卢龙县| 高邑县| 禄丰县| 岢岚县| 赤城县| 丹寨县| 金湖县| 榕江县| 新源县| 汝州市| 万山特区| 农安县| 鹤山市| 特克斯县| 庆安县| 柳江县| 黄龙县| 酉阳| 嘉义县| 外汇| 盐源县| 巴林右旗| 平顶山市| 柯坪县| 弋阳县| 嘉鱼县|