單例設計模式共享資料分析 解決 call once

2021-10-09 10:19:39 字數 2799 閱讀 9363

互斥量是最通用的保護共享資料的機制,用起來不難,而且特別好用。

當然也有其他保護共享資料的機制。

「設計模式」:**的一些寫法(這些寫法根常規寫法不怎麼一樣):程式靈活,維護起來很方便,但是別人接管、閱讀**都會很痛苦;

用「設計模式」理念寫出來的**是很晦澀的;

老外應付特別大的專案的時候,把專案的開發經驗、模組劃分經驗,總結成設計模式(現有開發需求,後又理論總結和整理)

設計模式拿到中國來,不太一樣,拿著乙個程式(專案)往設計模式上套,乙個小小的專案,非要弄幾個設計模式進去,本末倒置。

設計模式肯定有它獨特的優點,要活學活用,不要生搬硬套。

單例設計模式,使用的頻率比較高;

單例:整個專案中,有某個或者某些特殊的類,屬於該類的物件,我只能建立乙個,多了我建立不了。

所謂單例:是整個專案中,有某個或者某些特殊的類,只能建立乙個該類的物件。

單例類

class

mycas

private

:static mycas* m_instance;

public

:static mycas*

getinstance()

return m_instance;

}class

cgarhuishou

//類中套類,用來釋放物件}}

;void

func()

};//類靜態變數初始化

mycas* mycas::m_instance =

null

;int

main()

面臨的問題:需要在我們自己建立的執行緒(而不是主線程)中來建立mycas這個單例類的物件,這種執行緒可能不止乙個(最少2個)

我們可能面臨getinstance()這種成員函式要互斥;

void

mythread()

intmain()

雖然這兩個執行緒是同乙個入口函式,但大家千萬要記住,這是兩個執行緒,所以這裡會有兩個流程(兩條通路)同時開始執行mythread這個函式

std::mutex resource_mutex;
static mycas*

getinstance()

return m_instance;

}

上面的寫法不夠高效,更高效的方式:

static mycas*

getinstance()

}return m_instance;

}

小結

只有在未初始化時,去判斷

if (m_instance == null),去加鎖

初始化之後的後續都不需要加鎖

本節中共享資料m_instance = new mycas();,多個執行緒同時訪問執行的,

通過std::unique_lock臨界上,最外面加上雙重鎖定來提高多次呼叫getinstance的效率

c++11引入的函式,該函式的第二個引數是乙個函式名。

call_once的功能是能夠保證函式a()只被呼叫一次。

比如,兩個執行緒都呼叫函式a,只要用call_once,就能保證a函式只被呼叫1次。

call_once具備互斥量這種能力,而且效率上比互斥量的資源消耗更少。

call_once()需要與乙個標記結合使用,這個標記std::once_flag。其實once_flag是乙個結構,call_once就是通過這個標記決定對應的函式a()是否執行,呼叫call_once()成功後,call_once()就把這個標記設定為一種「已呼叫」的狀態,後續再次呼叫call_once,只要once_flag被設定為了「已呼叫」狀態,那麼函式a()就不會再執行了

例子:

std::once_flag g_flag;
class

mycas

private

:mycas()

private

:static mycas* m_instance;

public

:static mycas*

getinstance()

class

cgarhuishou

//類中套類,用來釋放物件}}

;void

func()

};

可以把std::once_flag g_flag看成一把鎖

(感覺還是沒聽懂)

舉個例子:

參考:c++11 std::call_once:保證函式在任何情況下只呼叫一次

#include

#include

#include

std::once_flag flag1;

void

******_do_once()

);}int

main()

結果:

****** example: called once

單例設計模式下的多執行緒資料共享 C

include include include using namespace std mutex resource mutex 增加互斥量 once flag g flag 系統定義的標記 較實用的單例類 class mycas private static mycas m instance 靜態...

粗糙分析設計模式 單例模式

一山不容二虎,哎 這次就粗糙講解一下單例模式,單例模式是為了讓系統中存在乙個例項,避免同時存在兩個例項下命令,試想一下,如果軟體同時向印表機傳遞命令,那麼印表機不就亂了嘛 臥槽,我該聽誰的 所以,單例模式的存在是非常有必要的,同時,還能減少系統的開銷,如果例項乙個類開銷非常大,單例模式也是非常實用的...

設計模式之單例模式分析

單例模式分為兩大類 懶漢式和餓漢式 其最主要的區別在於 懶漢式 指全域性的單例例項在第一次被使用時構建 餓漢式 指全域性的單例例項在類裝載時構建 日常我們使用的最多也是懶漢式,懶漢式是按需載入,能夠做到資源的最大利用 懶漢式 雖然這樣寫沒什麼問題,但是如果是多執行緒時可能出現問題了,如果多個執行緒同...