C++之RAII技術解析(資源、狀態管理)

原文:https://www.cnblogs.com/jiangbin/p/6986511.html

RAII 技術

        RAII技術被認爲是C++中管理資源的最佳方法,進一步引申,使用RAII技術也可以實現安全、簡潔的狀態管理,編寫出優雅的異常安全的代碼。

         RAII是C++的發明者Bjarne Stroustrup提出的概念,RAII全稱是“Resource Acquisition is Initialization”,直譯過來是“資源獲取即初始化”,也就是說在構造函數中申請分配資源,在析構函數中釋放資源。利用對象生命週期來控制程序資源(如內存、文件句柄、網絡連接、互斥量等等)的技術,因爲C++的語言機制保證了,當一個對象創建的時候,自動調用構造函數,當對象超出作用域的時候會自動調用析構函數。所以,在RAII的指導下,我們應該使用類來管理資源,將資源和對象的生命週期綁定。

 

資源管理

       智能指針(std::shared_ptr和std::unique_ptr)即RAII最具代表的實現,使用智能指針,可以實現自動的內存管理,再也不需要擔心忘記delete造成的內存泄漏。毫不誇張的來講,有了智能指針,代碼中幾乎不需要再出現delete了。

         內存只是資源的一種,在這裏我們討論一下更加廣義的資源管理。比如說文件的打開與關閉、windows中句柄的獲取與釋放、對數據庫的訪問、斷開數據庫連接等等。

            按照常規的RAII技術需要寫一堆管理它們的類,有的時候顯得比較麻煩。但是如果手動釋放,通常還要考慮各種異常處理。文章 http://mindhacks.cn/2012/08/27/modern-cpp-practices/ 介紹一個實現的比較簡潔的方法,使用了C++11標準中的lambda表達式和std::function相結合的方法,非常簡潔、明瞭(待總結)。

狀態管理

        RAII另一個引申的應用是可以實現安全的狀態管理。一個典型的應用就是在線程同步中,使用std::unique_lock或者std::lock_guard對互斥量std:: mutex進行狀態管理。通常我們不會寫出如下的代碼:

std::mutex mutex_;
void function()
{
    mutex_.lock();
    ......
    ......
    mutex_.unlock();
}

       因爲,在互斥量lock和unlock之間的代碼很可能會出現異常,或者有return語句,這樣的話,互斥量就不會正確的unlock,會導致線程的死鎖。所以正確的方式是使用std::unique_lock或者std::lock_guard對互斥量進行狀態管理:

std::mutex mutex_;
void function()
{
    std::lock_guard<std::mutex> lock(mutex_);
    ......
    ......
}

         在創建std::lock_guard對象的時候,會對std::mutex對象進行lock,當std::lock_guard對象在超出作用域時,會自動std::mutex對象進行解鎖,這樣的話,就不用擔心代碼異常造成的線程死鎖。

總結

        通過上面的分析可以看出,RAII的核心思想資源或者狀態對象的生命週期綁定,通過C++的語言機制,實現資源和狀態的安全管理。理解和使用RAII能使軟件設計更清晰,代碼更健壯。    

 

 

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