pthread_cleanup_push与pthread_cleanup_pop的目的、作用
?首先你必須知道pthread_cleanup_push與pthread_cleanup_pop的目的(作用)是什么。
比如thread1:執(zhí)行
這個(gè)例子中,如果線程1執(zhí)行accept時(shí),線程會阻塞(也就是等在那里,有客戶端連接的時(shí)候才返回,或則出現(xiàn)其他故障),線程等待中......
這時(shí)候線程2發(fā)現(xiàn)線程1等了很久,不賴煩了,他想關(guān)掉線程1,于是調(diào)用pthread_cancel()或者類似函數(shù),請求線程1立即退出。
這時(shí)候線程1仍然在accept等待中,當(dāng)它收到線程2的cancel信號后,就會從accept中退出,然后終止線程,注意這個(gè)時(shí)候線程1還沒有執(zhí)行:
pthread_mutex_unlock(&mutex);
也就是說鎖資源沒有釋放,這回造成其他線程的死鎖問題。
所以必須在線程接收到cancel后用一種方法來保證異常退出(也就是線程沒達(dá)到終點(diǎn))時(shí)可以做清理工作(主要是解鎖方面),
上面的代碼,如果accept被cancel后線程退出,會自動調(diào)用some_clean_func函數(shù),在這個(gè)函數(shù)中你可以釋放鎖資源。如果accept沒有被cancel,那么線程繼續(xù)執(zhí)行,當(dāng)pthread_mutex_unlock(&mutex);表示線程自己正確的釋放資源了,而執(zhí)行pthread_cleanup_pop(0);也就是取消掉前面的some_clean_func函數(shù)。接著return線程就正確的結(jié)束了。
不曉得你明白沒,通俗點(diǎn)就是:
pthread_cleanup_push注冊一個(gè)回調(diào)函數(shù),如果你的線程在對應(yīng)的pthread_cleanup_pop之前異常退出(return是正常退出,其他是異常),那么系統(tǒng)就會執(zhí)行這個(gè)回調(diào)函數(shù)(回調(diào)函數(shù)要做什么你自己決定)。但是如果在pthread_cleanup_pop之前沒有異常退出,pthread_cleanup_pop就把對應(yīng)的回調(diào)函數(shù)取消了。
關(guān)于取消點(diǎn)的解釋:
比如你執(zhí)行:
在sleep函數(shù)中,線程睡眠,結(jié)果收到cancel信號,這時(shí)候線程從sleep中醒來,但是線程不會立刻退出。這是應(yīng)為pthread與C庫方面的原因(具體是啥我也不清楚),pthread的建議是,如果一個(gè)函數(shù)是阻塞的,那么你必須在這個(gè)函數(shù)前后建立取消點(diǎn),比如:
這樣,就添加了兩個(gè)取消掉。在執(zhí)行到pthread_testcancel的位置時(shí),線程才可能響應(yīng)cancel退出進(jìn)程。
額外的知識:
對于cancel信號,線程有兩種方法: 忽略,和響應(yīng)。默認(rèn)是響應(yīng)
接收到cancel信號,線程有兩種處理類型: 立即響應(yīng) 和 延遲響應(yīng)(在最近的取消點(diǎn)響應(yīng)),默認(rèn)是延遲響應(yīng)
總結(jié)
以上是生活随笔為你收集整理的pthread_cleanup_push与pthread_cleanup_pop的目的、作用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言内存管理超详解
- 下一篇: linux线程下的读写锁