日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pthread_cleanup_push()/pthread_cleanup_pop()

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pthread_cleanup_push()/pthread_cleanup_pop() 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一般來說,Posix的線程終止有兩種情況:正常終止和非正常終止。線程主動調用pthread_exit()或者從線程函數中return都將使線程正常退出,這是可預見的退出方式;非正常終止是線程在其他線程的干預下,或者由于自身運行出錯(比如訪問非法地址)而退出,這種退出方式是不可預見的。

不論是可預見的線程終止還是異常終止,都會存在資源釋放的問題,在不考慮因運行出錯而退出的前提下,如何保證線程終止時能順利的釋放掉自己所占用的資源,特別是鎖資源,就是一個必須考慮解決的問題。

最經常出現的情形是資源獨占鎖的使用:線程為了訪問臨界資源而為其加上鎖,但在訪問過程中被外界取消,如果線程處于響應取消狀態,且采用異步方式響應,或者在打開獨占鎖以前的運行路徑上存在取消點,則該臨界資源將永遠處于鎖定狀態得不到釋放。外界取消操作是不可預見的,因此的確需要一個機制來簡化用于資源釋放的編程。

在POSIX線程API中提供了一個pthread_cleanup_push()/pthread_cleanup_pop()函數對用于自動釋放資源 --從pthread_cleanup_push()的調用點到pthread_cleanup_pop()之間的程序段中的終止動作(包括調用 pthread_exit()和取消點終止)都將執行pthread_cleanup_push()所指定的清理函數。API定義如下:

void pthread_cleanup_push(void (*routine) (void *), void *arg) void pthread_cleanup_pop(int execute)

pthread_cleanup_push()/pthread_cleanup_pop()采用先入后出的棧結構管理,void routine(void *arg)函數在調用pthread_cleanup_push()時壓入清理函數棧,多次對pthread_cleanup_push()的調用將在清理函數棧中形成一個函數鏈,在執行該函數鏈時按照壓棧的相反順序彈出。execute參數表示執行到pthread_cleanup_pop()時是否在彈出清理函數的同時執行該函數,為0表示不執行,非0為執行;這個參數并不影響異常終止時清理函數的執行。

pthread_cleanup_push()/pthread_cleanup_pop()是以宏方式實現的,這是pthread.h中的宏定義:

#define pthread_cleanup_push(routine,arg) { struct _pthread_cleanup_buffer _buffer; _pthread_cleanup_push (&_buffer, (routine), (arg)); #define pthread_cleanup_pop(execute) _pthread_cleanup_pop (&_buffer, (execute)); } 可見,pthread_cleanup_push()帶有一個"{",而pthread_cleanup_pop()帶有一個"}",因此這兩個函數必須成對出現,且必須位于程序的同一級別的代碼段中才能通過編譯。在下面的例子里,當線程在"do some work"中終止時,將主動調用pthread_mutex_unlock(mut),以完成解鎖動作。 work"中終止時,將主動調用pthread_mutex_unlock(mut),以完成解鎖動作。 pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut); pthread_mutex_lock(&mut); /* do some work */ pthread_mutex_unlock(&mut); pthread_cleanup_pop(0); 必須要注意的是,如果線程處于PTHREAD_CANCEL_ASYNCHRONOUS狀態,上述代碼段就有可能出錯,因為CANCEL事件有可能在 pthread_cleanup_push()和pthread_mutex_lock()之間發生,或者在pthread_mutex_unlock()和pthread_cleanup_pop()之間發生,從而導致清理函數unlock一個并沒有加鎖的 mutex變量,造成錯誤。因此,在使用清理函數的時候,都應該暫時設置成PTHREAD_CANCEL_DEFERRED模式。為此,POSIX的 Linux實現中還提供了一對不保證可移植的pthread_cleanup_push_defer_np()/pthread_cleanup_pop_defer_np()擴展函數,功能與以下 代碼段相當: { int oldtype;pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);pthread_cleanup_push(routine, arg);...pthread_cleanup_pop(execute);pthread_setcanceltype(oldtype, NULL);}
上面我用紅色標記的部分是這兩個函數的關鍵作用,我的理解就是: pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut); pthread_mutex_lock(&mut); /* do some work */ pthread_mutex_unlock(&mut); pthread_cleanup_pop(0); 本來do some work之后是有pthread_mutex_unlock(&mut);這句,也就是有解鎖操作,但是在do some work時會出現非正常終止,那樣的話,系統會根據pthread_cleanup_push中提供的函數,和參數進行解鎖操作或者其他操作,以免造成死鎖!

補充:
在線程宿主函數中主動調用return,如果return語句包含在pthread_cleanup_push()/pthread_cleanup_pop()對中,則不會引起清理函數的執行,反而會導致segment fault。

總結

以上是生活随笔為你收集整理的pthread_cleanup_push()/pthread_cleanup_pop()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美成人午夜电影 | 日日操夜夜操狠狠操 | 中午字幕在线观看 | 国产成年妇视频 | av国产成人| 麻豆射区 | 精品一区二区三区免费毛片爱 | 亚洲综合三区 | 污视频免费网站 | 大尺度舌吻呻吟声 | 久久精品99国产 | 精品一区二区视频在线观看 | 国产午夜精品一区二区三区 | 肉色超薄丝袜脚交69xx | 欧美成人精品欧美一级乱 | 狠狠干影视 | 日本少妇一区 | 国产做a| 99久久久久久久久 | 色呦呦在线看 | 欧美在线三区 | 综合婷婷久久 | 91超薄肉色丝袜交足高跟凉鞋 | 91国产丝袜播放在线 | 人人射人人 | 日本一级黄色录像 | 国产你懂的 | www.777奇米| 色呦呦官网 | av高清在线免费观看 | 一区二区国产精品精华液 | 黄色一区二区三区 | 香蕉网久久 | 绿帽av| 女女同性女同一区二区三区按摩 | 玩偶姐姐在线看 | 理想之城连续剧40集免费播放 | 美女扒开尿口让男人桶 | 婷婷俺也去 | 久久精品国产亚洲AV黑人 | 国产精品69毛片高清亚洲 | 妞干网这里只有精品 | chinese麻豆新拍video | 国产激情网站 | 91超级碰| 爱情岛论坛成人av | 银娇在线观看 | 豆花在线视频 | 99综合色 | 男女互操 | 亚州av网站| 国产在线高清 | 91爱爱爱爱 | 亚洲国产精品尤物yw在线观看 | 永久在线视频 | 国产av精国产传媒 | 好爽快一点高潮了 | 欧美大片一级 | 成人在线91| 日韩天堂在线 | 国产1区在线观看 | 天天摸天天干天天操 | 午夜伦伦| 欧美天天| 欧美在线观看一区二区 | 二区三区在线视频 | 九九福利| 亚洲成a人在线观看 | 超碰人人人人人人人 | 国产乱码一区二区三区在线观看 | 香蕉视频1024| 国产18禁黄网站免费观看 | 国产在线国偷精品免费看 | 操丝袜美女视频 | 粉嫩精品久久99综合一区 | 久久狠狠爱 | 三级不卡视频 | 亚洲成av人片在线观看 | 黄色avv| 国产一区免费观看 | aaa在线| 亚洲乱子伦 | 在线日韩 | 欧美激情一区二区三区蜜桃视频 | www亚洲成人 | 欧美不卡在线 | 九九热精品视频在线播放 | 九色porn蝌蚪 | 亚洲区自拍偷拍 | 欧美久久久久久久久久久 | 日本免费成人 | 午夜精品一区二区三区在线播放 | 欧美日韩观看 | 国产精选第一页 | 性欧美video另类hd尤物 | 青青草娱乐在线 | 狗爬女子的视频 | 久久人人超碰 | 精品久久中文 |