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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++中的 单例模式(singleton)和双检测锁(Double-Checked Locking)

發(fā)布時間:2025/3/15 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++中的 单例模式(singleton)和双检测锁(Double-Checked Locking) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

懶漢式實現(xiàn)的單例模式
上文中給出的懶漢式實現(xiàn)的單例模式,在單線程中使用時完全沒有問題的,但是在多線程中使用會存在多次對象多次創(chuàng)建的問題。

  • 線程A進(jìn)入getInstance方法,并進(jìn)入到if判斷,因為現(xiàn)在m_psl是空指針,這時剛好線程A時間片用完,開始切換到線程B,線程B也調(diào)用getInstance方法創(chuàng)建了一個對象
  • 線程B時間片用完,切換到線程A,這時線程A從if判斷成功之后的下不開始,又創(chuàng)建了一遍對象,這時已經(jīng)兩次創(chuàng)建對象了
  • 為了解決這個問題需要使用雙檢測,詳情可參考
    C++ and the Perils of Double-Checked Locking
    里面詳細(xì)說明了雙重檢測的方法,和最終的解決方案。

    要想解決上述懶漢單例模式中的問題,需要引入這個雙重檢測的功能,實現(xiàn)也只需將圖中的代碼在加鎖的基礎(chǔ)上,在添加一層檢測

    臨界區(qū)(Critical Section)。臨界區(qū)對象通過提供一個進(jìn)程內(nèi)所有線程必須
    共享的對象來控制線程。只有擁有那個對象的線程可以訪問保護資源。在另一個線
    程可以訪問該資源之前,前一個線程必須釋放臨界區(qū)對象,以便新的線程可以索取對象的訪問權(quán)

    最終實現(xiàn)效果如下

    if (m_psl == NULL) {// 這里線程開始資源競爭,只有一個線程能獲取lock的資源lock();if (m_psl == NULL){m_psl = new Singelton;}unlock(); }

    說明:
    lock里面判斷一次,因為可能有多個線程在lock處等待,一個成功之后,會將m_psl設(shè)置為非空,這樣下個線程就算拿到lock資源,再進(jìn)去發(fā)現(xiàn)指針非空就離開了
    lock外判斷一次,是因為獲取鎖,是很浪費時間的,獲取鎖之外還有一層判斷,那么在第二次獲取單例對象的時候,lock外的if判斷發(fā)現(xiàn)指針已經(jīng)非空,就不會再獲取鎖了,直接返回了對應(yīng)的對象,這樣雙層檢測,即保證了對象創(chuàng)建的唯一性,又減少了獲取鎖浪費的時間和資源

    不安全的單例模式代碼:

    #include <iostream> using namespace std;//懶漢式 class Singelton { private:Singelton(){cout << "Singelton 構(gòu)造函數(shù)執(zhí)行" << endl;} public:static Singelton *getInstance(){if (m_psl == NULL){m_psl = new Singelton;}return m_psl;}static void FreeInstance(){if (m_psl != NULL){delete m_psl;m_psl = NULL; }}private:static Singelton *m_psl; };Singelton *Singelton::m_psl = NULL;void main041() {Singelton *p1 = Singelton::getInstance();Singelton *p2 = Singelton::getInstance();if (p1 == p2){cout << "是同一個對象" << endl;}else{cout << "不是同一個對象" << endl;}Singelton::FreeInstance();return ; }

    總結(jié)

    以上是生活随笔為你收集整理的c++中的 单例模式(singleton)和双检测锁(Double-Checked Locking)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。