互斥量是最通用的保護共享資料的機制,用起來不難,而且特別好用。
當然也有其他保護共享資料的機制。
「設計模式」:**的一些寫法(這些寫法根常規寫法不怎麼一樣):程式靈活,維護起來很方便,但是別人接管、閱讀**都會很痛苦;
用「設計模式」理念寫出來的**是很晦澀的;
老外應付特別大的專案的時候,把專案的開發經驗、模組劃分經驗,總結成設計模式(現有開發需求,後又理論總結和整理)
設計模式拿到中國來,不太一樣,拿著乙個程式(專案)往設計模式上套,乙個小小的專案,非要弄幾個設計模式進去,本末倒置。
設計模式肯定有它獨特的優點,要活學活用,不要生搬硬套。
單例設計模式,使用的頻率比較高;
單例:整個專案中,有某個或者某些特殊的類,屬於該類的物件,我只能建立乙個,多了我建立不了。
即所謂單例:是整個專案中,有某個或者某些特殊的類,只能建立乙個該類的物件。
單例類
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 靜態...
粗糙分析設計模式 單例模式
一山不容二虎,哎 這次就粗糙講解一下單例模式,單例模式是為了讓系統中存在乙個例項,避免同時存在兩個例項下命令,試想一下,如果軟體同時向印表機傳遞命令,那麼印表機不就亂了嘛 臥槽,我該聽誰的 所以,單例模式的存在是非常有必要的,同時,還能減少系統的開銷,如果例項乙個類開銷非常大,單例模式也是非常實用的...
設計模式之單例模式分析
單例模式分為兩大類 懶漢式和餓漢式 其最主要的區別在於 懶漢式 指全域性的單例例項在第一次被使用時構建 餓漢式 指全域性的單例例項在類裝載時構建 日常我們使用的最多也是懶漢式,懶漢式是按需載入,能夠做到資源的最大利用 懶漢式 雖然這樣寫沒什麼問題,但是如果是多執行緒時可能出現問題了,如果多個執行緒同...