Android C++多線程按順序退出並釋放資源

我的視頻課程(編碼直播推流):《Android視頻編碼和直播推流》

        通過這段時間的加班,終於把我的FFmpeg開發課程《FFmpeg打造Android萬能音頻播放器》和《FFmpeg+OpenGL ES+OpenSL ES打造Android視頻播放器》錄製完成了。在開發過程中涉及到了許多的知識點,其中一個就是C++多線程解碼退出問題,今天我們就來講講怎樣按順序退出多線程。

一、引出問題

        首先我們來看一下FFmpeg解碼多線程流程圖:

從圖中我們看到了至少得用3個線程來解碼視頻:

第一個是:FFmpeg的解碼線程

第二個是:音頻播放線程

第三個是:視頻播放線程

並且,這3個線程都是在while循環中執行的,因此當我們想停止播放時問題就來了:我們需要分別停止這3個線程並回收線程資源,而這3個線程也有共同的操作對象。當線程還在執行時我們就回收資源的話(因爲線程中有sleep操作,不能保證在回收資源錢線程就退出了),就會導致還在執行的線程調用資源時出現錯誤的地址訪問,導致崩潰現象,這是多線程中經常出現的一個問題。

二、解決方案

爲了解決上面的問題,我們最理想的就是:在回收資源之前,需要把所有訪問資源的線程給停止掉,然後就可以放心的回收資源了。那麼解決的辦法也有許多:

第一種:就在線程的最後直接回收資源,只要線程結束,就回收資源,如:

第二種:添加變量來判斷線程是否退出,回收資源前循環判斷此變量,知道線程退出後纔回收資源,如:

第三種:使用pthread_join(thread, void**)函數,這個函數會阻塞當前線程,直到目標線程退出後才往下執行。這就是最完美的等待線程退出的方法。

三、實現過程

在回收資源之前,調用pthread_join函數阻塞當前線程,等待目標線程退出後纔回收資源,這樣就能保證回收的資源時沒有被使用的:

這樣就能完美的解決多線程退出問題了,我們還可以指定退出順序,完全按照自己的想法退出,就能很好地解決我們的問題了。

四、實例代碼

這裏我寫了一個模擬多線程解碼的demo,詳細代碼我就不貼出來了,文末有實例下載地址,可以自行下載運行。

4.1 未添加線程控制pthread_join函數時效果:

我們發現,資源已經回收之後,而音頻或視頻的解碼線程還在解碼,這樣就會導致方法資源地址錯誤。

4.2 使用線程控制pthread_join函數時效果:

從上面打印日誌可以看出,都是先退出線程後回收資源,這樣就能保證多線程退出的安全性了。

五、總結

FFmpeg解碼音視頻算是很複雜的了,裏面牽扯太多知識點。但是任何複雜的功能,都是有一個個功能(知識點)組合而來的,只有當我們把這些知識點理解透徹之後,才能寫出健壯而複雜的程序出來,最後來一張我視頻課程裏面的效果圖:

 

好了,就到這裏吧,實例下載地址:

GitHub地址:C++多線程退出並釋放資源

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章