锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲丝袜中文字幕,亚洲人色婷婷成人网站在线观看,亚洲系列国产精品制服丝袜第http://www.tkk7.com/killvin/category/15182.htmlzh-cnThu, 01 Mar 2007 15:37:26 GMTThu, 01 Mar 2007 15:37:26 GMT60Double Checked Locking 妯″紡http://www.tkk7.com/killvin/archive/2006/09/13/69499.htmlkillvinkillvinWed, 13 Sep 2006 15:16:00 GMThttp://www.tkk7.com/killvin/archive/2006/09/13/69499.html

ACE涓殑Double Checked Locking 妯″紡


(浣滆?Douglas C. Schmidt ,by huihoo.org CORBA璇鵑 Thzhang 璇?, Allen鏁寸悊,鍒朵綔)

鎰忓浘

鏃犺浠涔堟椂鍊欏綋涓寸晫鍖轟腑鐨勪唬鐮佷粎浠呴渶瑕佸姞閿佷竴嬈★紝鍚屾椂褰撳叾鑾峰彇閿佺殑鏃跺欏繀欏繪槸綰跨▼瀹夊叏鐨勶紝鍙互鐢―ouble Checked Locking 妯″紡鏉ュ噺灝戠珵浜夊拰鍔犻攣杞借嵎銆?

鍔ㄦ満

1銆佹爣鍑嗙殑鍗曚緥銆傚紑鍙戞紜殑鏈夋晥鐨勫茍鍙戝簲鐢ㄦ槸鍥伴毦鐨勩傜▼搴忓憳蹇呴』瀛︿範鏂扮殑鎶鏈紙騫跺彂鎺у埗鍜岄槻姝㈡閿佺殑綆楁硶錛夊拰鏈哄埗錛堝澶氱嚎紼嬪拰鍚屾API錛夈傛澶栵紝璁稿鐔熸?zhèn)夌殑璁捐妯″紡锛堝鍗曚緥鍜寴q唬瀛愶級鍦ㄥ寘鍚笉浣跨敤浠諱綍騫跺彂涓婁笅鏂囧亣璁劇殑欏哄簭紼嬪簭涓彲浠ュ伐浣滅殑寰堝ソ銆備負浜嗚鏄庤繖鐐癸紝鑰冭檻涓涓爣鍑嗙殑鍗曚緥妯″紡鍦ㄥ綰跨▼鐜涓嬬殑瀹炵幇銆傚崟渚嬫ā寮忎繚璇佷竴涓被浠呮湁涓涓疄渚嬪悓鏃舵彁渚涗簡鍏ㄥ眬鍞竴鐨勮闂繖涓疄渚嬬殑鍏ュ彛鐐廣傚湪c++紼嬪簭涓姩鎬佸垎閰嶅崟渚嬪璞℃槸閫氱敤鐨勬柟寮忥紝榪欐槸鍥犱負c++紼嬪簭娌℃湁寰堝ソ鐨勫畾涔夐潤鎬佸叏灞瀵硅薄鐨勫垵濮嬪寲嬈″簭錛屽洜姝ゆ槸涓嶅彲縐繪鐨勩傝屼笖錛屽姩鎬佸垎閰嶉伩鍏嶄簡鍗曚緥瀵硅薄鍦ㄦ案榪滄病鏈夎浣跨敤鎯呭喌涓嬬殑鍒濆鍖栧紑閿銆?


class Singleton
{
public:
static Singleton *instance (void)
{
if (instance_ == 0)
// Critical section.
instance_ = new Singleton;
return instance_;
}
void method (void);
// Other methods and members omitted.
private:
static Singleton *instance_;
};



搴旂敤浠g爜鍦ㄤ嬌鐢ㄥ崟渚嬪璞℃彁渚涚殑鎿嶄綔鍓嶏紝閫氳繃璋冪敤闈欐佺殑instance鏂規(guī)硶鏉ヨ幏鍙栧崟渚嬪璞$殑寮曠敤錛屽涓嬫墍紺猴細
Singleton::instance ()->method ();
2銆侀棶棰橈細绔炰簤鏉′歡銆備笉騫哥殑鏄紝涓婇潰灞曠ず鐨勬爣鍑嗗崟渚嬫ā寮忕殑瀹炵幇鍦ㄦ姠鍏堝浠誨姟鍜岀湡姝e茍琛岀幆澧冧笅鏃犳硶姝e父宸ヤ綔銆備緥濡傦紝濡傛灉鍦ㄥ茍琛屼富鏈轟笂榪愯鐨勫涓嚎紼嬪湪鍗曚緥瀵硅薄鍒濆鍖栦箣鍓嶅悓鏃惰皟鐢⊿ingleton::instance鏂規(guī)硶錛孲ingleton鐨勬瀯閫犲嚱鏁板皢琚皟鐢ㄥ嬈★紝榪欐槸鍥犱負澶氫釜綰跨▼灝嗗湪涓婇潰灞曠ず鐨勪復鐣屽尯涓墽琛宯ew singleton鎿嶄綔銆備復鐣屽尯鏄竴涓繀欏婚伒瀹堜笅鍒楀畾寮忕殑鎸囦護搴忓垪錛氬綋涓涓嚎紼?榪涚▼鍦ㄤ復鐣屽尯涓繍琛屾椂錛屾病鏈夊叾浠栦換浣曠嚎紼?榪涚▼浼氬悓鏃跺湪涓寸晫鍖轟腑榪愯銆傚湪榪欎釜渚嬪瓙涓紝鍗曚緥鐨勫垵濮嬪寲榪囩▼鏄竴涓復鐣屽尯錛岃繚鍙嶄復鐣屽尯鐨勫師鍒欙紝鍦ㄦ渶濂界殑鎯呭喌涓嬪皢瀵艱嚧鍐呭瓨娉勬紡錛屾渶鍧忕殑鎯呭喌涓嬶紝濡傛灉鍒濆鍖栬繃紼嬩笉鏄箓絳夌殑錛坕dempotent.錛夛紝灝嗗鑷翠弗閲嶇殑鍚庢灉銆?

3銆?閫氬父鐨勯櫡闃卞拰寮婄銆傚疄鐜頒復鐣屽尯鐨勯氬父鏂規(guī)硶鏄湪綾諱腑澧炲姞涓涓潤鎬佺殑Mutex瀵硅薄銆傝繖涓狹utex淇濊瘉鍗曚緥鐨勫垎閰嶅拰鍒濆鍖栨槸鍘熷瓙鎿嶄綔錛屽涓嬶細


class Singleton
{
public:
static Singleton *instance (void)
{
// Constructor of guard acquires lock_ automatically.
Guard guard (lock_);
// Only one thread in the critical section at a time.
if (instance_ == 0)
instance_ = new Singleton;
return instance_;
// Destructor of guard releases lock_ automatically.
}
private:
static Mutex lock_;
static Singleton *instance_;
};


guard綾諱嬌鐢ㄤ簡涓涓猚++鐨勪範鎯敤娉曪紝褰撹繖涓被鐨勫璞″疄渚嬭鍒涘緩鏃訛紝瀹冧嬌鐢ㄦ瀯閫犲嚱鏁版潵鑷姩鑾峰彇涓涓祫婧愶紝褰撶被瀵硅薄紱誨紑涓涓尯鍩熸椂錛屼嬌鐢ㄦ瀽鏋勫櫒鏉ヨ嚜鍔ㄩ噴鏀捐繖涓祫婧愩傞氳繃浣跨敤guard錛屾瘡涓涓Singleton::instance鏂規(guī)硶鐨勮闂皢鑷姩鐨勮幏鍙栧拰閲婃斁lock_銆?
鍗充嬌榪欎釜涓寸晫鍖哄彧鏄浣跨敤浜嗕竴嬈★紝浣嗘槸姣忎釜瀵筰nstance鏂規(guī)硶鐨勮皟鐢ㄩ兘蹇呴』鑾峰彇鍜岄噴鏀緇ock_銆傝櫧鐒剁幇鍦ㄨ繖涓疄鐜版槸綰跨▼瀹夊叏鐨勶紝浣嗚繃澶氱殑鍔犻攣璐熻澆鏄笉鑳借鎺ュ彈鐨勩備竴涓槑鏄撅紙铏界劧涓嶆紜級鐨勪紭鍖栨柟娉曟槸灝唃uard鏀懼湪閽堝instance榪涜鏉′歡媯嫻嬬殑鍐呴儴錛?


static Singleton *instance (void)
{
if (instance_ == 0) {
Guard guard (lock_);
// Only come here if instance_ hasn't been initialized yet.
instance_ = new Singleton;
}
return instance_;
}

榪欏皢鍑忓皯鍔犻攣璐熻澆錛屼絾鏄笉鑳芥彁渚涚嚎紼嬪畨鍏ㄧ殑鍒濆鍖栥傚湪澶氱嚎紼嬬殑搴旂敤涓紝浠嶇劧瀛樺湪绔炰簤鏉′歡錛屽皢瀵艱嚧澶氭鍒濆鍖杋nstance_銆備緥濡傦紝鑰冭檻涓や釜綰跨▼鍚屾椂媯嫻?instance_ == 0錛岄兘灝嗕細鎴愬姛錛屼竴涓皢閫氳繃guard鑾峰彇lock_鍙︿竴涓皢琚樆濉炪傚綋絎竴綰跨▼鍒濆鍖朣ingleton鍚庨噴鏀緇ock_錛岃闃誨鐨勭嚎紼嬪皢鑾峰彇lock_錛岄敊璇殑鍐嶆鍒濆鍖朣ingleton銆?
4銆佽В鍐充箣閬擄紝Double Checked Locking浼樺寲銆傝В鍐寵繖涓棶棰樻洿濂界殑鏂規(guī)硶鏄嬌鐢―ouble Checked Locking銆傚畠鏄竴縐嶇敤浜庢竻闄や笉蹇呰鍔犻攣榪囩▼鐨勪紭鍖栨ā寮忋傚叿鏈夎鍒烘剰鍛崇殑鏄紝瀹冪殑瀹炵幇鍑犱箮鍜屽墠闈㈢殑鏂規(guī)硶涓鏍楓傞氳繃鍦ㄥ彟涓涓潯浠舵嫻嬩腑鍖呰瀵筺ew鐨勮皟鐢ㄦ潵閬垮厤涓嶅繀瑕佺殑鍔犻攣錛?


class Singleton
{
public:
static Singleton *instance (void)
{
// First check
if (instance_ == 0)
{
// Ensure serialization (guard constructor acquires lock_).
Guard guard (lock_);
// Double check.
if (instance_ == 0)
instance_ = new Singleton;
}
return instance_;
// guard destructor releases lock_.
}
private:
static Mutex lock_;
static Singleton *instance_;
};


絎竴涓幏鍙杔ock_鐨勭嚎紼嬪皢鏋勫緩Singleton錛屽茍灝嗘寚閽堝垎閰嶇粰instance_錛屽悗緇皟鐢╥nstance鏂規(guī)硶鐨勭嚎紼嬪皢鍙戠幇instance_ != 0錛屼簬鏄皢璺寵繃鍒濆鍖栬繃紼嬨傚鏋滃涓嚎紼嬭瘯鍥懼茍鍙戝垵濮嬪寲Singleton錛岀浜屼釜媯嫻嬩歡闃繪绔炰簤鏉′歡鐨勫彂鐢熴傚湪涓婇潰鐨勪唬鐮佷腑錛岃繖浜涚嚎紼嬪皢鍦╨ock_涓婃帓闃燂紝褰撴帓闃熺殑綰跨▼鏈緇堣幏鍙杔ock_鏃訛紝浠栦滑灝嗗彂鐜癷nstance_ != 0浜庢槸灝嗚煩榪囧垵濮嬪寲榪囩▼銆?

涓婇潰Singleton::instance鐨勫疄鐜頒粎浠呭湪Singleton棣栨琚垵濮嬪寲鏃訛紝濡傛灉鏈夊涓嚎紼嬪悓鏃惰繘鍏nstance鏂規(guī)硶灝嗗鑷村姞閿佽礋杞姐傚湪鍚庣畫瀵筍ingleton::instance鐨勮皟鐢ㄥ洜涓篿nstance_ != 0鑰屼笉浼氭湁鍔犻攣鍜岃В閿佺殑璐熻澆銆?閫氳繃澧炲姞涓涓猰utex鍜屼竴涓簩嬈℃潯浠舵嫻嬶紝鏍囧噯鐨勫崟渚嬪疄鐜板彲浠ユ槸綰跨▼瀹夊叏鐨勶紝鍚屾椂涓嶄細浜х敓榪囧鐨勫垵濮嬪寲鍔犻攣璐熻澆銆?

閫傚簲鎬?/h3>> 褰撲竴涓簲鐢ㄥ叿鏈変笅鍒楃壒寰佹椂錛屽彲浠ヤ嬌鐢―ouble Checked Locking浼樺寲妯″紡錛?
1銆佸簲鐢ㄥ寘鍚竴涓垨澶氫釜闇瑕侀『搴忔墽琛岀殑涓寸晫鍖轟唬鐮併?
2銆佸涓嚎紼嬪彲鑳芥綔鍦ㄧ殑璇曞浘騫跺彂鎵ц涓寸晫鍖恒?
3銆佷復鐣屽尯浠呬粎闇瑕佽鎵ц涓嬈°?
4銆佸湪姣忎竴涓涓寸晫鍖虹殑璁塊棶榪涜鍔犻攣鎿嶄綔灝嗗鑷磋繃澶氬姞閿佽礋杞姐?
5銆佸湪涓涓攣鐨勮寖鍥村唴澧炲姞涓涓交閲忕殑錛屽彲闈犵殑鏉′歡媯嫻嬫槸鍙鐨勩?

緇撴瀯鍜屽弬涓庤?/h3>閫氳繃浣跨敤浼唬鐮佽兘澶熸渶濂藉湴灞曠ずDouble Checked Locking妯″紡鐨勭粨鏋勫拰鍙備笌鑰咃紝鍥?灞曠ず浜嗗湪Double Checked Locking妯″紡鏈変笅鍒楀弬涓庤咃細



1銆佷粎鏈変竴嬈′復鐣屽尯錛圝ust Once Critical Section,錛夈備復鐣屽尯鎵鍖呭惈鐨勪唬鐮佷粎浠呰鎵ц涓嬈°備緥濡傦紝鍗曚緥瀵硅薄浠呬粎琚垵濮嬪寲涓嬈°傝繖鏍鳳紝鎵ц瀵筺ew Singleton鐨勮皟鐢紙鍙湁涓嬈★級鐩稿浜嶴ingleton::instance鏂規(guī)硶鐨勮闂皢闈炲父紼灝戙?
2銆乵utex銆傞攣琚敤鏉ュ簭鍒楀寲瀵逛復鐣屽尯涓唬鐮佺殑璁塊棶銆?
3銆佹爣璁般傛爣璁拌鐢ㄦ潵鎸囩ず涓寸晫鍖虹殑浠g爜鏄惁宸茬粡琚墽琛岃繃銆傚湪涓婇潰鐨勪緥瀛愪腑鍗曚緥鎸囬拡instance_琚敤鏉ヤ綔涓烘爣璁般?
4銆?搴旂敤綰跨▼銆傝瘯鍥炬墽琛屼復鐣屽尯浠g爜鐨勭嚎紼嬨?

鍗忎綔

鍥?灞曠ず浜咲ouble Checked Locking妯″紡鐨勫弬涓庤呬箣闂寸殑浜掑姩銆備綔涓轟竴縐嶆櫘閫氱殑浼樺寲鐢ㄤ緥錛屽簲鐢ㄧ嚎紼嬮鍏堟嫻媐lag鏄惁宸茬粡琚緗傚鏋滄病鏈夎璁劇疆錛宮utex灝嗚鑾峰彇銆傚湪鎸佹湁榪欎釜閿佷箣鍚庯紝搴旂敤綰跨▼灝嗗啀嬈℃嫻媐lag鏄惁琚緗紝瀹炵幇Just Once Critical Section錛岃瀹歠lag涓虹湡銆傛渶鍚庡簲鐢ㄧ嚎紼嬮噴鏀鵑攣銆?



緇撹

浣跨敤Double Checked Locking妯″紡甯︽潵鐨勫嚑鐐瑰ソ澶勶細
1銆佹渶灝忓寲鍔犻攣銆傞氳繃瀹炵幇涓や釜flag媯嫻嬶紝Double Checked Locking妯″紡瀹炵幇閫氬父鐢ㄤ緥鐨勪紭鍖栥備竴鏃lag琚緗紝絎竴涓嫻嬪皢淇濊瘉鍚庣畫鐨勮闂笉瑕佸姞閿佹搷浣溿?
2銆侀槻姝㈢珵浜夋潯浠躲傚flag鐨勭浜屼釜媯嫻嬪皢淇濊瘉涓寸晫鍖轟腑鐨勪簨浠朵粎瀹炵幇涓嬈°?
浣跨敤Double Checked Locking妯″紡涔熷皢甯︽潵涓涓己鐐癸細浜х敓寰鐨勭Щ妞峛ug鐨勬綔鑳姐傝繖涓井濡欑殑縐繪闂鑳藉瀵艱嚧鑷村懡鐨刡ug錛屽鏋滀嬌鐢―ouble Checked Locking妯″紡鐨勮蔣浠惰縐繪鍒版病鏈夊師瀛愭х殑鎸囬拡鍜屾鏁拌祴鍊艱涔夌殑紜歡騫沖彴涓娿備緥濡傦紝濡傛灉涓涓猧nstance_鎸囬拡琚敤鏉ヤ綔涓篠ingleton瀹炵幇鐨刦lag錛宨nstance_鎸囬拡涓殑鎵鏈変綅錛坆it錛夊繀欏誨湪涓嬈℃搷浣滀腑瀹屾垚璇誨拰鍐欍傚鏋滃皢new鐨勭粨鏋滃啓鍏ュ唴瀛樹笉鏄竴涓師瀛愭搷浣滐紝鍏朵粬鐨勭嚎紼嬪彲鑳戒細璇曞浘璇誨彇涓涓笉鍋ュ叏鐨勬寚閽堬紝榪欏皢瀵艱嚧闈炴硶鐨勫唴瀛樿闂?
鍦ㄤ竴浜涘厑璁稿唴瀛樺湴鍧璺ㄨ秺瀵歸綈杈圭晫鐨勭郴緇熶笂榪欑鐜拌薄鏄彲鑳界殑錛屽洜姝ゆ瘡嬈¤闂渶瑕佷粠鍐呭瓨涓彇涓ゆ銆傚湪榪欑鎯呭喌涓嬶紝緋葷粺鍙兘浣跨敤鍒嗙鐨勫瓧瀵歸綈鍚堟垚flag錛屾潵琛ㄧずinstance_鎸囬拡銆?
濡傛灉涓涓繃浜庢縺榪涳紙aggressive錛夌紪璇戝櫒閫氳繃鏌愮緙撳啿鎵嬫鏉ヤ紭鍖杅lag錛屾垨鏄Щ闄や簡絎簩涓猣lag==0媯嫻嬶紝灝嗗甫鏉ュ彟澶栫殑鐩稿叧闂銆傚悗闈細浠嬬粛濡備綍浣跨敤volatile鍏抽敭瀛楁潵瑙e喅榪欎釜闂銆?

瀹炵幇鍜屼緥瀛愪唬鐮?/h3>ACE鍦ㄥ涓簱緇勪歡涓嬌鐢―ouble Checked Locking妯″紡銆備緥濡傦紝涓轟簡鍑忓皯浠g爜鐨勯噸澶嶏紝ACE浣跨敤浜嗕竴涓彲閲嶇敤鐨勯傞厤鍣ˋCE Singleton鏉ュ皢鏅氱殑綾昏漿鎹㈡垚鍏鋒湁鍗曚緥琛屼負鐨勭被銆備笅闈㈢殑浠g爜灞曠ず浜嗗浣曠敤Double Checked Locking妯″紡鏉ュ疄鐜癆CE Singleton銆?


// A Singleton Adapter: uses the Adapter
// pattern to turn ordinary classes into
// Singletons optimized with the
// Double-Checked Locking pattern.
template 
class ACE_Singleton
{
public:
static TYPE *instance (void);
protected:
static TYPE *instance_;
static LOCK lock_;
};
template  TYPE *
ACE_Singleton::instance ()
{
// Perform the Double-Checked Locking to
// ensure proper initialization.
if (instance_ == 0) {
ACE_Guard lock (lock_);
if (instance_ == 0)
instance_ = new TYPE;
}
return instance_;
}


ACE Singleton綾昏TYPE鍜孡OCK鏉ュ弬鏁板寲銆傚洜姝や竴涓粰瀹歍YEP鐨勭被灝嗚杞崲鎴愪嬌鐢↙OCK綾誨瀷鐨勪簰鏂ラ噺鐨勫叿鏈夊崟渚嬭涓虹殑綾匯?
ACE涓殑Token Manager.鏄嬌鐢ˋCE Singleton鐨勪竴涓緥瀛愩俆oken Manager瀹炵幇鍦ㄥ綰跨▼搴旂敤涓鏈湴鍜岃繙绔殑token錛堜竴縐嶉掑綊閿侊級姝婚攣媯嫻嬨備負浜嗗噺灝戣祫婧愮殑浣跨敤錛孴oken Manager琚寜闇鍒涘緩銆備負浜嗗垱寤轟竴涓崟渚嬬殑Token Manager瀵硅薄錛屽彧鏄渶瑕佸疄鐜頒笅闈㈢殑typedef錛?

typedef ACE_Singleton Token_Mgr;
Token Manager鍗曚緥灝嗚鐢ㄤ簬鏈湴鍜岃繙绔殑token姝婚攣媯嫻嬨傚湪涓涓嚎紼嬮樆濉炵瓑寰呬簰鏂ラ噺涔嬪墠錛屽畠棣栧厛鏌ヨToken Manager鍗曚緥錛屾潵嫻嬭瘯闃誨鏄惁浼氬鑷存閿佺姸鎬併傚浜庣郴緇熶腑鐨勬瘡涓涓猼oken錛孴oken Manager鍗曚緥緇存姢涓涓寔鏈塼oken綰跨▼鍜屾墍鏈夐樆濉炵瓑寰呭湪璇oken鐨勭嚎紼嬭褰曢摼琛ㄣ傝繖浜涙暟鎹皢鎻愪緵鍏呰凍鐨勬嫻嬫閿佺姸鎬佺殑渚濇嵁銆備嬌鐢═oken Manager鍗曚緥鐨勮繃紼嬪涓嬶細


// Acquire the mutex.
int Mutex_Token::acquire (void)
{
// If the token is already held, we must block.
if (mutex_in_use ()) {
// Use the Token_Mgr Singleton to check
// for a deadlock situation *before* blocking.
if (Token_Mgr::instance ()->testdeadlock ()) {
errno = EDEADLK;
return -1;
				}
else
// Sleep waiting for the lock...
		// Acquire lock...
		}

鍙樺寲

涓縐嶅彉鍖栫殑Double Checked Locking妯″紡瀹炵幇鍙兘鏄渶瑕佺殑錛屽鏋滀竴涓紪璇戝櫒閫氳繃鏌愮緙撳啿鏂瑰紡浼樺寲浜唂lag銆傚湪榪欑鎯呭喌涓嬶紝緙撳啿鐨勭矘鐫鎬э紙coherency錛夊皢鍙樻垚闂錛屽鏋滄嫹璐漟lag鍒板涓嚎紼嬬殑瀵勫瓨鍣ㄤ腑錛屼細浜х敓涓嶄竴鑷寸幇璞°傚鏋滀竴涓嚎紼嬫洿鏀筬lag鐨勫煎皢涓嶈兘鍙嶆槧鍦ㄥ叾浠栫嚎紼嬬殑瀵瑰簲鎷瘋礉涓?

鍙︿竴涓浉鍏崇殑闂鏄紪璇戝櫒縐婚櫎浜嗙浜屼釜flag==0媯嫻嬶紝鍥犱負瀹冨浜庢寔鏈夐珮搴︿紭鍖栫壒鎬х殑緙栬瘧鍣ㄦ潵璇存槸澶氫綑鐨勩備緥濡傦紝涓嬮潰鐨勪唬鐮佸湪嬋榪涚殑緙栬瘧鍣ㄤ笅灝嗚璺寵繃瀵筬lag鐨勮鍙栵紝鑰屾槸鍋囧畾instance_榪樻槸涓?錛屽洜涓哄畠娌℃湁琚0鏄庝負volatile鐨勩?

Singleton *Singleton::instance (void)
{
if (Singleton::instance_ == 0)
{
// Only lock if instance_ isn't 0.
Guard guard (lock_);
// Dead code elimination may remove the next line.
// Perform the Double-Check.
if (Singleton::instance_ == 0)
// ...



瑙e喅榪欎袱涓棶棰樼殑涓涓柟娉曟槸鐢熷懡flag涓篠ingleton鐨剉olatile鎴愬憳鍙橀噺錛屽涓嬶細
private:
static volatile long Flag_; // Flag is volatile.
浣跨敤volatile灝嗕繚璇佺紪璇戝櫒涓嶄細灝唂lag緙撳啿鍒扮紪璇戝櫒錛屽悓鏃朵篃涓嶄細浼樺寲鎺夌浜屾璇繪搷浣溿備嬌鐢╲olatile鍏抽敭瀛楃殑璦涓嬩箣鎰忔槸鎵鏈夊flag鐨勮闂槸閫氳繃鍐呭瓨錛岃屼笉鏄氳繃瀵勫瓨鍣ㄣ?

鐩稿叧妯″紡

Double Checked Locking妯″紡鏄疐irst-Time-In涔犳儻鐢ㄦ硶鐨勪竴涓彉鍖栥侳irst-Time-In涔犳儻鐢ㄦ硶緇忓父浣跨敤鍦ㄧ被浼糲榪欑緙哄皯鏋勯犲櫒鐨勭▼搴忚璦涓紝涓嬮潰鐨勪唬鐮佸睍紺轟簡榪欎釜妯″紡錛?


	static const int STACK_SIZE = 1000;
static T *stack_;
static int top_;
void push (T *item)
{
// First-time-in flag
if (stack_ == 0) {
stack_ = malloc (STACK_SIZE * sizeof *stack);
assert (stack_ != 0);
top_ = 0;
}
stack_[top_++] = item;
// ...
}



絎竴嬈ush琚皟鐢ㄦ椂錛宻tack_鏄?錛岃繖灝嗗鑷磋Е鍙憁alloc鏉ュ垵濮嬪寲瀹冭嚜宸便?


killvin 2006-09-13 23:16 鍙戣〃璇勮
]]> 主站蜘蛛池模板: 久久精品国产精品亚洲色婷婷 | 亚洲乱码精品久久久久..| 亚洲av色香蕉一区二区三区蜜桃| 中文字幕亚洲免费无线观看日本| 亚洲色婷婷综合久久| 99麻豆久久久国产精品免费 | 久久精品无码免费不卡| 亚洲福利视频一区二区| 杨幂最新免费特级毛片| 免费少妇a级毛片人成网| 无套内射无矿码免费看黄| 免费中文字幕在线| 一区二区免费国产在线观看| 亚洲精品成a人在线观看| 成人自慰女黄网站免费大全| 亚洲中文字幕在线观看| 你懂的网址免费国产| 久久精品国产亚洲AV网站| 最近中文字幕完整免费视频ww| 亚洲国产精品久久66| 三年片在线观看免费大全| 亚洲精品宾馆在线精品酒店| 免费女人18毛片a级毛片视频| 国产精品综合专区中文字幕免费播放| 亚洲精品偷拍视频免费观看| 久久成人免费大片| 2020年亚洲天天爽天天噜| 免费a级毛片网站| 你懂的网址免费国产| 中文字幕亚洲综合久久2| 国产又黄又爽又猛免费app| 亚洲Av永久无码精品一区二区| 亚洲AV网站在线观看| 日本免费污片中国特一级| 亚洲一级毛片在线观| 免费国产成人午夜电影| 国产午夜无码精品免费看动漫| avtt天堂网手机版亚洲| 亚洲欧洲一区二区三区| 伊人久久免费视频| 亚洲AV网一区二区三区|