锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久亚洲欧美国产精品乐播,裸体一区二区三区,欧美a级理论片 http://www.shnenglu.com/lymons/category/5678.html<h1><b>蹇冪伒鐨勬梾琛?lt;/b></h1></p>
浜虹敓灝辨槸涓鍦烘梾琛岋紝涓嶅湪涔庢梾琛岀殑鐩殑鍦幫紝鍦ㄤ箮鐨勬槸娌塊旂殑椋庢櫙鍜岀湅椋庢櫙鐨勫績鎯?! zh-cn Sun, 14 Nov 2010 01:16:05 GMT Sun, 14 Nov 2010 01:16:05 GMT 60 C++ 灞閮ㄩ潤鎬佸垵濮嬪寲涓嶆槸綰跨▼瀹夊叏鐨勶紒 http://www.shnenglu.com/lymons/archive/2010/08/01/120638.htmllymons lymons Sun, 01 Aug 2010 05:19:00 GMT http://www.shnenglu.com/lymons/archive/2010/08/01/120638.html http://www.shnenglu.com/lymons/comments/120638.html http://www.shnenglu.com/lymons/archive/2010/08/01/120638.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/120638.html http://www.shnenglu.com/lymons/services/trackbacks/120638.html
璇鋒敞鎰?C++ 灞閮ㄩ潤鎬佸垵濮嬪寲涓嶆槸綰跨▼瀹夊叏!
http://blogs.msdn.com/b/oldnewthing/archive/2004/03/08/85901.aspx
8 Mar 2004 7:00 AM
鍦ㄥ潡浣滅敤鍩熶腑鐨勯潤鎬佸彉閲忕殑瑙勫垯 (涓庝箣鐩稿鐨勬槸鍏ㄥ眬浣滅敤鍩熺殑闈欐佸彉閲? 鏄? 紼嬪簭絎竴嬈℃墽琛屽埌浠栫殑澹版槑鐨勬椂鍊欒繘琛屽垵濮嬪寲.
瀵熺湅涓嬮潰鐨勭珵浜夋潯浠?
int ComputeSomething()
{
static int cachedResult = ComputeSomethingSlowly();
return cachedResult;
}
榪欐浠g爜鐨勬剰鍥炬槸鍦ㄨ鍑芥暟絎竴嬈¤璋冪敤鐨勬椂鍊欏幓璁$畻涓浜涜垂鐢? 騫朵笖鎶婄粨鏋滅紦鍐茶搗鏉ュ緟鍑芥暟灝嗘潵鍐嶈璋冪敤鐨勬椂鍊欏垯鐩存帴榪斿洖榪欎釜鍊煎嵆鍙?
榪欎釜鍩烘湰鎶宸х殑鍙樼,鍦ㄧ綉緇滀笂涔熻鍙仛 閬垮厤 "static initialization order fiasco" . ( fiasco榪欎釜璇?鍦ㄨ繖涓綉欏典笂鏈夐潪甯告鐨勬弿榪?鍥犳鎴戝緩璁ぇ瀹跺幓璇諱竴璇葷劧鍚庡幓鐞嗚В瀹?)
榪欐浠g爜鐨勯棶棰樻槸闈炵嚎紼嬪畨鍏ㄧ殑. 鍦ㄥ眬閮ㄤ綔鐢ㄥ煙涓殑闈欐佸彉閲忔槸緙栬瘧鏃朵細鍦ㄧ紪璇戝櫒鍐呴儴杞崲鎴愪笅闈㈢殑鏍峰瓙:
int ComputeSomething()
{
static bool cachedResult_computed = false;
static int cachedResult;
if (!cachedResult_computed) {
cachedResult_computed = true;
cachedResult = ComputeSomethingSlowly();
}
return cachedResult;
}
鐜板湪绔炰簤鏉′歡灝辨瘮杈冨鏄撶湅鍒頒簡.
鍋囪涓や釜綰跨▼鍦ㄥ悓涓鏃跺埢閮借皟鐢ㄨ繖涓嚱鏁? 絎竴涓嚎紼嬪湪鎵ц cachedResult_computed = true 鍚? 琚姠鍗? 絎簩涓嚎紼嬬幇鍦ㄧ湅鍒扮殑 cachedResult_computed 鏄竴涓湡鍊? true ),鐒跺悗灝辯暐榪囦簡if鍒嗘敮鐨勫鐞?鏈鍚庤鍑芥暟榪斿洖鐨勬槸涓涓湭鍒濆鍖栫殑鍙橀噺.
鐜板湪浣犵湅鍒扮殑涓滆タ騫朵笉鏄竴涓紪璇戝櫒鐨刡ug, 榪欎釜琛屼負 C++ 鏍囧噯鎵瑕佹眰鐨?
浣犱篃鑳藉啓涓涓彉浣撴潵浜х敓涓涓洿緋熺硶鐨勯棶棰?
class Something { ... };
int ComputeSomething()
{
static Something s;
return s.ComputeIt();
}
鍚屾牱鐨勫湪緙栬瘧鍣ㄥ唴閮ㄥ畠浼氳閲嶅啓 (榪欐, 鎴戜滑浣跨敤C++浼唬鐮?:
class Something { ... };
int ComputeSomething()
{
static bool s_constructed = false;
static uninitialized Something s;
if (!s_constructed) {
s_constructed = true;
new(&s) Something; // construct it
atexit(DestructS);
}
return s.ComputeIt();
}
// Destruct s at process termination
void DestructS()
{
ComputeSomething::s.~Something();
}
娉ㄦ剰榪欓噷鏈夊閲嶇殑绔炰簤鏉′歡. 灝卞儚鍓嶉潰鎵璇寸殑, 涓涓嚎紼嬪緢鍙兘鍦ㄥ彟涓涓嚎紼嬩箣鍓嶈繍琛屽茍涓斿湪"s"榪樻病鏈夎鏋勯犲墠灝變嬌鐢ㄥ畠.
鐢氳嚦鏇寸碂緋曠殑鎯呭喌, 絎竴涓嚎紼嬪緢鍙兘鍦╯_contructed 鏉′歡鍒ゅ畾 涔嬪悗,鍦ㄤ粬琚緗垚"true"涔嬪墠 琚姠鍗? 鍦ㄨ繖縐嶅満鍚堜笅, 瀵硅薄s灝變細琚?span style="font-weight: bold;">鍙岄噸鏋勯?/span>鍜?span style="font-weight: bold;">鍙岄噸鏋愭瀯.
榪欐牱灝變笉鏄緢濂?
浣嗘槸絳夌瓑, 榪欏茍涓嶆槸鍏ㄩ儴, 鐜板湪(鍘熸枃鏄疦ot,鎴戣涓烘槸Now鐨勭瑪璇?鐪嬬湅濡傛灉鏈?span style="font-style: italic;">涓や釜榪愯鏈熷垵濮嬪寲灞閮ㄩ潤鎬佸彉閲忕殑璇濅細鍙戠敓浠涔?
class Something { ... };
int ComputeSomething()
{
static Something s(0);
static Something t(1);
return s.ComputeIt() + t.ComputeIt();
}
涓婇潰鐨勪唬鐮佷細琚紪璇戝櫒杞寲涓轟笅闈㈢殑浼狢++浠g爜:
class Something { ... };
int ComputeSomething()
{
static char constructed = 0;
static uninitialized Something s;
if (!(constructed & 1)) {
constructed |= 1;
new(&s) Something; // construct it
atexit(DestructS);
}
static uninitialized Something t;
if (!(constructed & 2)) {
constructed |= 2;
new(&t) Something; // construct it
atexit(DestructT);
}
return s.ComputeIt() + t.ComputeIt();
}
涓轟簡鑺傜渷絀洪棿, 緙栬瘧鍣ㄤ細鎶婁袱涓?x_constructed" 鍙橀噺鏀懼埌涓涓?bitfield 涓? 鐜板湪榪欓噷鍦ㄥ彉閲?construted"涓婂氨鏈夊涓?span style="font-weight: bold;">鏃犲唴閮ㄩ攣瀹?/span>鐨勮-鏀?瀛樻搷浣?
鐜板湪鑰冭檻涓涓嬪鏋滀竴涓嚎紼嬪皾璇曞幓鎵ц "constructed |= 1", 鑰屽湪鍚屼竴鏃墮棿鍙︿竴涓嚎紼嬪皾璇曟墽琛?"constructed |= 2".
鍦▁86騫沖彴涓? 榪欐潯璇彞浼氳姹囩紪鎴?/p>
or constructed, 1
...
or constructed, 2
騫舵病鏈?"lock" 鍓嶇紑. 鍦ㄥ澶勭悊鏈哄櫒涓? 寰堟湁鍙兘鍙戠敓涓や釜瀛樺偍閮藉幓璇誨悓涓涓棫鍊煎茍涓斾簰鐩鎬嬌鐢ㄥ啿紿佺殑鍊艱繘琛岀鎾?clobber).
鍦?ia64 鍜?alpha騫沖彴涓? 榪欎釜紕版挒灝嗘洿鍔犳槑鏄?鍥犱負瀹冧滑涔堟病鏈夎繖鏍風殑璇?鏀?瀛?/span>鐨勫崟鏉℃寚浠? 鑰屾槸琚紪鐮佹垚涓夋潯鎸囦護:
ldl t1,0(a0) ; load
addl t1,1,t1 ; modify
stl t1,1,0(a0) ; store
濡傛灉榪欎釜綰跨▼鍦?load 鍜?store涔嬮棿琚姠鍗? 榪欎釜瀛樺偍鐨勫煎彲鑳藉皢涓嶅啀鏄畠鏇劇粡瑕佸啓鍏ョ殑閭d釜鍊?
鍥犳,鐜板湪鑰冭檻涓嬮潰榪欎釜鏈夐棶棰樼殑鎵ц欏哄簭:
綰跨▼A 鍦ㄦ祴璇?"constructed" 鏉′歡鍚庡彂鐜頒粬鏄浂, 騫朵笖姝h鍑嗗鎶婅繖涓艱瀹氭垚1錛?浣嗘槸瀹冭鎶㈠崰浜?
綰跨▼B 榪涘叆鍚屾牱鐨勫嚱鏁? 鐪嬪埌 "constructed" 鏄浂騫剁戶緇幓鏋勯?"s" 鍜?"t", 紱誨紑鏃?"constructed" 絳変簬3.
綰跨▼A 緇х畫鎵ц騫朵笖瀹屾垚瀹冪殑 璇?鏀?瀛?鐨勬寚浠ゅ簭鍒? 璁懼畾 "constructed" 鎴?1, 鐒跺悗鏋勯?"s" (絎簩嬈?.
綰跨▼A 鐒跺悗緇х畫鍘繪瀯閫?"t" (絎簩嬈? 騫惰瀹?"constructed" (鏈緇? 鎴?3.
鐜板湪, 浣犲彲鑳戒細璁や負浣犺兘鐢ㄤ復鐣屽尯 (critical section) 鏉ュ皝瑁呰繖涓繍琛屾湡鍒濆鍖栧姩浣?
int ComputeSomething()
{
EnterCriticalSection(...);
static int cachedResult = ComputeSomethingSlowly();
LeaveCriticalSection(...);
return cachedResult;
}
鍥犱負浣犵幇鍦ㄦ妸榪欎釜涓嬈″垵濮嬪寲鏀懼埌浜嗕復鐣屽尯閲岄潰,鑰屼嬌瀹冪嚎紼嬪畨鍏?
浣嗘槸濡傛灉浠庡悓涓涓嚎紼嬪啀涓嬈¤皟鐢ㄨ繖涓嚱鏁頒細鎬庢牱? ("鎴戜滑璺熻釜浜嗚繖涓皟鐢? 瀹冪‘瀹炴槸鏉ヨ嚜榪欎釜綰跨▼!") 濡傛灉 ComputeSomethingSlowly() 瀹冭嚜宸遍棿鎺ュ湴璋冪敤 ComputeSomething()灝變細鍙戠敓榪欎釜鐘跺喌.
緇撹: 褰撲綘鐪嬭涓涓眬閮ㄩ潤鎬佸彉閲忓湪榪愯鏈熷垵濮嬪寲鏃? 浣犱竴瀹氳灝忓績.
]]> 鐢–++緙栧啓synchronized method姣旇緝闅?/title> http://www.shnenglu.com/lymons/archive/2010/07/17/118502.htmllymons lymons Sat, 17 Jul 2010 04:17:00 GMT http://www.shnenglu.com/lymons/archive/2010/07/17/118502.html http://www.shnenglu.com/lymons/comments/118502.html http://www.shnenglu.com/lymons/archive/2010/07/17/118502.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/118502.html http://www.shnenglu.com/lymons/services/trackbacks/118502.html 鍦–++涓嬬紪鍐檚ynchronized method姣旇緝闅?(1)
鍦↗ava涓湁鍙仛synchronized榪欐牱涓涓柟渚跨殑鍏抽敭瀛椼備嬌鐢ㄨ繖涓叧閿瓧鐨勮瘽,灝卞彲浠ュ儚涓嬮潰閭f牱鑳藉綆鍗曠殑榪涜"鍚屾"method. 鐒惰?琚悓姝ョ殑method騫朵笉琛ㄧず瀹冨氨鑳藉湪澶氱嚎紼嬩腑鍚屾椂琚墽琛?
public class Foo { public synchronized boolean getFoo() { }
閭d箞銆佸湪C++ (with pthread)涓浣曡兘瀹炵幇鍚屾牱鐨勫姛鑳藉憿? 棣栧厛,鏈変竴涓渶綆鍗曠殑鏂規(guī)硶灝辨槸涓嬮潰榪欎釜.
// 鏂規(guī)硶 a void Foo::need_to_sync( void ) { static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock( & mutex); // 涓寸晫鍖哄鐞?nbsp; pthread_mutex_unlock( & mutex); return ; }
榪欎釜鏂規(guī)硶, 鏆備笖涓嶈C璇█, 灝辨槸鍦–++涓笅闈㈢殑鑻ュ共闂
鍦ㄤ復鐣屽尯涓棿琚玶eturn鍑烘潵
鍦ㄤ復鐣屽尯涓棿鍙戠敓寮傚父exception
鍙戠敓鐨勫満鍚? mutex娌℃湁琚В閿乽nlock銆傛垜浠彲浠ュ儚涓嬮潰浠g爜閭f牱瀵硅繖鐐硅繘琛屾敼榪?
// 鏂規(guī)硶 b class ScopedLock : private boost::noncopyable { public : explicit ScopedLock(pthread_mutex_t & m) : m_(m) { pthread_mutex_lock( & m_); } ~ ScopedLock(pthread_mutex_t & m) { pthread_mutex_unlock( & m_); } private : pthread_mutex_t & m_; }; void Foo::need_to_sync( void ) { static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; { // 铏界劧涓嶅姞榪欎釜鎷彿紼嬪簭涔熸病鏈夐棶棰樸?/span> ScopedLock lock (mutex); // 鍦ㄦ澶勬坊鍔犲鐞?/span> } return ; }
OK銆俽eturn鍜屽紓甯哥殑闂灝卞彲浠ヨВ鍐充簡. 浣嗘槸, 涓婇潰騫舵病鏈夊畬鍏ㄨВ鍐寵繖涓棶棰?浠嶇劧鏈変笅闈㈣繖涓棶棰?
浣跨敤榪欎釜pthread_mutex_t騫朵笉鏄疌++鐨?鐗瑰埆鏄瓨鍦ㄤ笅闈㈢殑闂:
涓嶈兘鍜屽叾浠栫殑Mutex綾誨瀷鍋氬悓鏍風殑澶勭悊
涓庡叾浠栫殑Mutex綾誨瀷浣跨敤鍚屼竴涓猄copedLock綾?鍒欎笉鑳絣ock
Java鐨剆ynchronized鏂規(guī)硶铏界劧鍙互"閫掑綊lock", 浣嗘槸涓婇潰鐨勪唬鐮佸茍涓嶆槸榪欐牱. 鍦ㄤ復鐣屽尯涓掑綊璋冪敤鑷繁鐨勮瘽灝變細鍙戠敓姝婚攣.
鐗瑰埆鏄?絎?鐐圭殑閫掑綊lock鐨勯棶棰樻槸寰堥噸瑕佺殑. 榪欓噷濂藉ソ鍦頒嬌鐢╣libc鎵╁睍鐨勮瘽灝卞彲浠ヨ薄涓嬮潰閭f牱瑙e喅.
/ 鏂規(guī)硶 c void Foo::need_to_sync( void ) { static pthread_mutex_t mutex = PTHREAD_MUTEX_RECURSIVE_INITIALIZER_NP;
浠嶯Ppthread_mutex_init鏉ュ垵濮嬪寲閫掑綊mutex,鑰宲thread_mutex_init鍑芥暟鍦ㄤ竴涓嚎紼嬩腑鍙兘琚皟鐢ㄤ竴嬈? 濡傛灉鎯寵鐢╯ynchronized method鐨勬柟娉曟潵瀹炵幇榪欎釜鐨勮瘽,灝卞彉鎴愪簡"鏄厛鏈夐浮榪樻槸鍏堟湁铔?鐨勮瘽棰樹簡. 鎵浠?鐢ㄥ彨鍋歱thread_once鐨勫嚱鏁版潵瀹炵幇瀹?榪欎篃鏄?a >鍦⊿USv3涓璁拌澆鐨勫畾鍒?/a>銆?/p>
// 鏂規(guī)硶 d namespace /* anonymous */ { pthread_once_t once = PTHREAD_ONCE_INIT; pthread_mutex_t mutex; pthread_mutexattr_t attr; void mutex_init() { pthread_mutexattr_init( & attr); pthread_mutexattr_settype( & attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init( & mutex, & attr); } } void Foo::need_to_sync( void ) { pthread_once( & once, mutex_init); { ScopedLock lock (mutex); // 鍑︾悊 } return ; }
涓婇潰鐨勪唬鐮佸氨O(jiān)K浜嗐?/p>
榪欏氨鑳藉瑙e喅閫掑綊lock鐨勯棶棰樹簡.浣嗘槸..., 榪欎釜鏂規(guī)硶
榪欒秺鏉ヨ秺涓嶅儚C++鐨勪唬鐮佷簡.銆傚姣忎竴涓兂瑕佸悓姝?synchronize)鐨勬柟娉曢兘鍍忚繖涔堟牱鍐欎唬鐮佺殑璇?鏁堢巼鍙樺緱闈炲父浣庝笅.
闅忔満鎴愭湰澶с傞熷害鎱€?
灝變細浜х敓涓婇潰閭f牱鐨勬柊闂.
鈻?/span> [C++ ] 鍦–++涓嬬紪鍐檚ynchronized method姣旇緝闅?2)
"涓? 鏂規(guī)硶鐨勫悓姝ュ簲璇ユ槸緇忓父蹇呴渶鐨? 騫朵笉鏄病鏈夋柟渚跨殑鍔炴硶",榪欐牱鐨勮娉曚篃鏈夊惂. 鏄殑, 鏈? 涓鑸殑鍔炴硶鏄笅闈㈤偅鏍?
鍋氭垚涓涓狹utex,浣滀負(non-POD鍨嬬殑, 鍗蟲櫘閫氱殑)C++綾?
鍋氭垚涓涓狹utex綾葷殑瀹炰緥,浣滀負綾誨彉閲? 鎴栬呮槸鍏ㄥ眬鍙橀噺, 鏉ュ悓姝ュ寲鏂規(guī)硶
鏉ョ湅鐪嬪畠鐨勫叿浣撳疄鐜板惂. 棣栧厛鍋氭垚鐨凪utex綾繪槸涓嬮潰閭f牱銆?/p>
class Mutex { public : Mutex() { pthread_mutex_init( & m_, 0 ); } void Lock( void ) { pthread_mutex_lock( & m_); } void Unlock( void ) { pthread_mutex_unlock( & m_); } private : pthread_mutex_t m_; };
鐜板湪鐨凪utex綾?琚綔涓烘娊璞″熀綾?鎺ュ彛綾?鐨勫満鍚堜篃姣旇緝澶? 鍦ㄨ繖閲屽氨涓嶈浜? ScopedLock綾諱篃闇瑕佹湁鑻ュ共鐨勪慨鏀? 鎯充笅闈㈤偅鏍峰啓灝卞ソ.
template < typename T > class ScopedLock { public : ScopedLock(T & m) : _m(m) { _m.Lock(); } ~ ScopedLock() { _m.Unlock(); } private : T & _m; };
鐢ㄨ繖涓狹utex綾繪潵鍚屾鏂規(guī)硶, 灝卞彲浠ュ儚涓嬮潰閭f牱鍐? 棣栧厛鏄湅鐪嬩竴涓槑鏄劇殑鏈夐敊璇殑渚嬪瓙.
// 鏂規(guī)硶e void Foo::need_to_sync( void ) { static Mutex mutex; { ScopedLock < Mutex > lock (mutex); // 鍑︾悊 } return ; }
榪欐槸... 浠g爜铏界劧綆鍗曟槗鎳?浣嗘槸寰堥仐鎲?瀹冧笉鑳藉緢濂藉伐浣? NG!. Foo::need_to_sync鍑芥暟絎竴嬈¤鎵ц鐨勬椂鍊欏鏋滄伆濂芥槸澶氫釜綰跨▼鍚屾椂鎵ц鐨勮瘽, mutex 鐨勬瀯閫犲嚱鏁板氨鏈夎澶氭璋冪敤鐨勫彲鑳芥?鍏充簬鐞嗙敱錛屽彲浠ュ弬鑰冨井杞腑姣旇緝鏈夊悕姘旂殑blog鏂囩珷The Old New Thing銆?a C++ scoped static initialization is not thread-safe, on purpose!"鍦ㄨ繖閲岄潰鏈夎灝界殑鎻忚堪錛屾墍浠ュ氨鎴戜滑灝變笉鍦ㄨ緇嗗彊榪頒簡銆傚湪榪欑瘒blog閲屼嬌鐢ㄤ簡VC++鐨勪唬鐮佷綔涓轟緥瀛愶紝浣嗘槸g++涔熸槸宸笉澶氱殑銆傛墍浠?strong>“鍔ㄦ佺殑鍒濆鍖栧眬閮ㄧ殑闈欐佸彉閲?#8221;鏄紝 鍦ㄧ嚎紼嬫墍瀹屽叏鎰忚瘑涓嶅埌鐨勬儏鍐典笅榪涜鐨?span class="footnote">*4 銆?/p>
鎺ヤ笅鏉ワ紝瑕佷粙緇嶄竴涓湪鐩墠鍋氱殑姣旇緝濂界殑鏂規(guī)硶銆?涓轟簡綆鍗曟垜浠嬌鐢ㄤ簡鍏ㄥ眬鍙橀噺錛屼絾鏄嵆浣夸綔涓虹被鍙橀噺錛堢被涓殑static鎴愬憳鍙橀噺錛変篃鏄竴鏍風殑銆傝繖涓柟娉曞氨鏄嬌鐢?#8220;闈炲眬閮ㄧ殑闈欐佸彉閲?#8221;鏉ュ仛鎴怣utex銆?/p>
// 鏂規(guī)硶f namespace /* anonymous */ { Mutex mutex; } void Foo::need_to_sync( void ) { ScopedLock < Mutex > lock (mutex); // 澶勭悊 return ; }
榪欎釜鏄渶嫻佽鐨勬柟娉曪紝鑰屼笖鍩烘湰 涓婂彲浠ユ病鏈夐棶棰樺氨鑳藉伐浣滃緱寰堝ソ銆?/p>
鍦ㄤ竴涓叏灞鐨勭被瀵硅薄x瀛樺湪錛屼笖鍦▁鐨勬瀯閫犲嚱鏁頒腑鐩存帴鎴栬呯粫寮棿鎺ョ殑璋冪敤Foo::need_to_sync鍑芥暟鐨勫満鍚堬紝浼氬紩璧蜂竴浜涢棶棰樸備篃灝辨槸闈欐佺殑瀵硅薄鐨勫垵濮嬪寲欏哄簭鐨勯棶棰橈紝榪欎釜闂涓鑸篃琚彨鍋?static initialization order fiasco" 銆傚湪鎵ц鍒癿utex鐨勬瀯閫犲嚱鏁頒箣鍓嶏紝 mutex.Lock()鏈夊彲鑳戒細琚墽琛屻?/p>
榪欓噷鐨凢AQ 鐨?0.12锝?0.16銆佸湪閲岄潰瀵硅嚜宸辯殑浠g爜鐨勫垵濮嬪寲欏哄簭宸茬粡璇佹槑浜嗘病鏈夐棶棰橈紝鑰屼笖灝嗘潵涔熶笉浼氬嚭鐜伴棶棰橈紝鎵浠ヤ笂闈㈢殑鏂規(guī)硶鏄疧K鐨勩?/p>
濡傛灉錛?鍒濆鍖栭『搴忕殑闂涓嶈兘淇濊瘉浠栨病鏈夐棶棰樼殑璇濓紝 鍙ソ浣跨敤pthread_once鐨?#8220;鏂規(guī)硶d”錛屾垨鑰呯Щ妞嶆т綆鐨?#8220;鏂規(guī)硶c”銆傛垜鐨勪釜浜烘劅瑙夋槸鏂規(guī)硶c榪樻槸姣旇緝涓嶉敊鐨勯夋嫨銆?/p>
鍦ㄦ渶鍚庢垜浠皾璇曡冭檻涓涓嬪浣曟妸鏂規(guī)硶c鍙樻垚C++鐨勪唬鐮併?/p>
// 鏂規(guī)硶c (閲嶆柊璁ㄨ) void Foo::need_to_sync(void) { static pthread_mutex_t mutex = PTHREAD_MUTEX_RECURSIVE_INITIALIZER_NP;
鐩爣鏄?/p>
闅愯棌pthread_mutex_t綾誨瀷銆佽鑷繁鍐欑殑綾葷殑綾誨瀷鍙銆?
鍦ㄦ柟娉昬,f涓儚浣跨敤ScopedLock妯℃澘閭f牱榪涜淇敼銆?
褰撶劧錛屼笉璁╁畠鍙戠敓鍒濆鍖栭『搴忕殑闂銆?br>
鈻?/span> [C++ ] 鐢–++緙栧啓synchronized method姣旇緝闅?(3)
榪欐槸鏂規(guī)硶c鐨勬敼鑹?棣栧厛錛?涓轟簡閬垮厤鍙戠敓鍒濆鍖栭『搴忕殑闂錛?蹇呴』鏄笉鍏佽璋冪敤鏋勯犲嚱鏁板氨鑳藉畬鎴愬璞$殑鍒濆鍖栥傚洜姝わ紝蹇呴』鍍忎笅闈㈤偅鏍峰垵濮嬪寲mutex瀵硅薄
// 鏂規(guī)硶c' (鍋囪) void Foo::need_to_sync(void) { static StaticMutex mutex = { PTHREAD_MUTEX_RECURSIVE_INITIALIZER_NP, ........ };
涓鑸殑涓嶅厑璁稿儚榪欐牱鍒濆鍖朇++綾匯備負浜嗗疄鐜頒笂闈㈤偅鏍風殑鍒濆鍖栵紝StaticMutex綾誨繀欏繪槸POD鍨嬬殑銆傛墍璋揚OD鍨嬪氨鏄紝
涓嶅厑璁告湁鏋勯犲嚱鏁?
涓嶅厑璁告湁鏋愭瀯鍑芥暟
涓嶅厑璁哥紪璇戝櫒鐢熸垚鎷瘋礉鏋勯犲嚱鏁幫紝 璧嬪兼瀯閫犲嚱鏁般?
涓嶅厑璁告湁private, protected 鐨勬垚鍛?
涓嶅厑璁告湁铏氬嚱鏁?
婊¤凍浠ヤ笂瑙勬牸鐨勭被鍨?span class="footnote">*6 銆?/p>
澶ф鏈変弗鏍肩殑鍒剁害,浣嗘槸鍒╃敤"瀹氫箟闈炶櫄鎴愬憳鍑芥暟鏄病鏈夐棶棰樼殑"榪欎釜鐗規(guī)? 鎴戜滑灝濊瘯鏀硅壇鏂規(guī)硶c鐨勬柟妗?
...鍍忎笅闈㈤偅鏍峰浣?
// 鏂規(guī)硶c' #define POD_MUTEX_MAGIC 0xdeadbeef #define STATIC_MUTEX_INITIALIZER { PTHREAD_INITIALIZER, POD_MUTEX_MAGIC } #define STATIC_RECURSIVE_MUTEX_INITIALIZER { PTHREAD_RECURSIVE_INITIALIZER_NP, POD_MUTEX_MAGIC } class PODMutex { public : void Lock() { assert(magic_ == POD_MUTEX_MAGIC); pthread_mutex_lock( & mutex_); } void Unlock() { assert(magic_ == POD_MUTEX_MAGIC); pthread_mutex_unlock( & mutex_); } typedef ScopedLock < PODMutex > ScopedLock; public : // 铏界劧緙栫▼浜哖OD鍨? 浣嗘槸涓嶅畾涔夋垚public灝辨槸鏃犳晥鐨?/span> pthread_mutex_t mutex_; const unsigned int magic_; }; // ScopedLock綾繪ā鏉挎槸鐣欑敤浜嗗湪鏂規(guī)硶e,f涓仛鎴愮殑浠g爜. void Foo::need_to_sync( void ) { static PODMutex mutex = STATIC_RECURSIVE_MUTEX_INITIALIZER; { PODMutex::ScopedLock lock (mutex); // 澶勭悊. } return ; }
涓婇潰鐨勪唬鐮佹弧瓚充簡"闅愯棌浜唒thread_mutex_t鍨?鐣欑敤浜哠copedLock<>"榪欎袱涓洰鐨? 榪欎笉灝辨槸鏈夌偣鍎垮儚C++鐨勪唬鐮佷簡鍚? 榪樻湁,PODMutex綾誨瀷鏄嵆浣垮湪涓婅渚嬪瓙涓偅鏍風殑灞閮ㄩ潤鎬佸彉閲忎互澶?涔熻兘鏀懼績鐨勪嬌鐢ㄥ叏灞鍙橀噺,綾誨彉閲忎簡.
鑰屼笖, 鎴愬憳鍙橀噺 magic_ 鏄? 涓涓猚onst鎴愬憳鍙橀噺, 鎵浠ュ綋浣跨敤緙栬瘧鍣ㄨ嚜鍔ㄧ敓鎴愮殑鏋勯犲嚱鏁版潵鍒涘緩涓涓璞℃椂灝變細鍙戠敓閿欒. 鍥犳,鍦ㄦ瀯寤簉elease鐗堢▼搴忔椂鎶婂畠鍓旈櫎灝卞ソ浜?
浣跨敤g++ -S鏉ョ紪璇戜笂闈㈢殑浠g爜, 鐢熸垚姹囩紪浠g爜. 鎴戜滑灝辮兘鐪嬭涓嬮潰閭f牱鐨勫眬閮ㄧ殑闈欐佸彉閲?
$ g++ -S sample.cpp $ c++filt < sample.s | lv (鐣? .size Foo::need_to_sync()::mutex, 28 Foo::need_to_sync()::mutex: .long 0 .long 0 .long 0 .long 1 .long 0 .long 0 .long -559038737
0,0,0,1,0,0 榪欐牱鐨勪笢瑗挎槸 PTHREAD_RECURSIVE_INITIALIZER_NP , -559038737 鍒欐槸 POD_MUTEX_MAGIC 銆傚嵆浣挎病鏈夎繘琛屽姩鎬佺殑鍒濆鍖?涓嶈皟鐢ㄦ瀯閫犲嚱鏁?銆佷粎浠呮槸鍦ㄧ洰鏍囨枃浠朵笂鐢熸垚鐨勭洰鏍囦唬鐮侀偅鏍風殑榪涜闈欐佸垵濮嬪寲, mutex瀵硅薄涔熻兘琚甯哥殑鍒濆鍖? 鎵浠ヨ繖孌典唬鐮佹槸OK鐨?
闅忎究, 鍦ㄤ嬌鐢╞oost搴撶殑鍦哄悎, 鏂規(guī)硶f涔嬪鐨勯夋嫨浣欏湴鍑犱箮娌℃湁(鑷沖皯鏄幇鍦?. 涓鐪嬭ML絳? (褰撶劧!!)灝辯煡閬撳彲鑳戒細鍑虹幇 order欏哄簭鐨勯棶棰? 浣嗘槸, 灝辯洰鍓嶆潵璁? 鏃㈣淇濊瘉鏃㈣淇濊瘉鍙Щ妞嶆?a title="Windows銇仼銇嗐仚銈嬶紵銇ㄣ亜銇嗗懡欏屻倰瑙f焙銇с亶銇亜銇亱銈傘仐銈屻伨銇涖倱 - 鎺ㄦ脯" name="20040713fn7">*7鍜岄熷害,鍙堣鑳藉仛鎴愪笌鏂規(guī)硶c鐩稿綋鐨凱ODMutex鐨勬柟娉曞ソ鍍忚繕娌℃湁鍑虹幇鍚?
瀹岀粨
]]> CodeBlocks鎻掍歡寮鍙戞寚鍗?涓? http://www.shnenglu.com/lymons/archive/2010/04/29/113991.htmllymons lymons Thu, 29 Apr 2010 12:58:00 GMT http://www.shnenglu.com/lymons/archive/2010/04/29/113991.html http://www.shnenglu.com/lymons/comments/113991.html http://www.shnenglu.com/lymons/archive/2010/04/29/113991.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/113991.html http://www.shnenglu.com/lymons/services/trackbacks/113991.html 鎴戜滑鍦ㄨ繖閲岋紝灝嗕細鍦ㄦ彃浠朵腑鍔犲叆鍙抽敭寮瑰嚭鑿滃崟鍔熻兘銆備篃灝辨槸濡備笅鍥鵑偅鏍鳳紝鍦ㄦ枃妗e尯鍐咃紝鐐瑰嚮榧犳爣鍙抽敭鏃朵細寮瑰嚭鐨勮彍鍗曘傛垜浠皢鍦ㄨ繖涓彍鍗曚腑鍔犲叆灞炰簬鎴戜滑鎻掍歡鐨勮彍鍗曢」鐩漷estplug鈥濄?
鍔犲叆鑿滃崟欏圭洰鐨勬晥鏋滃涓嬪浘錛?
璁╂垜浠湅鐪嬶紝鍜變滑鍒涘緩鐨勬彃浠跺伐紼嬩腑錛岀粰鎴戜滑鎻愪緵浜嗕粈涔堟牱鐨勫叆鍙d唬鐮佷簡鍚с? 1. 鍦ㄥ嚱鏁癇uildModuleMenu涓坊鍔犺彍鍗曢」銆? 鍦ㄦ枃妗g殑瑙嗗浘閲屾墠鍔犲叆鑿滃崟欏圭殑鍏ュ彛鍑芥暟鏄疊uildModuleMenu,瀹冪殑鍒濆浠g爜鏄笅闈㈤偅鏍鳳細
void testplug::BuildModuleMenu(const ModuleType type, wxMenu* menu, const FileTreeData* data)
{
//Some library module is ready to display a pop-up menu.
//Check the parameter \"type\" and see which module it is
闃呰鍏ㄦ枃 ]]> CodeBlocks鎻掍歡寮鍙戞寚鍗?浜? http://www.shnenglu.com/lymons/archive/2010/04/20/113099.htmllymons lymons Tue, 20 Apr 2010 14:21:00 GMT http://www.shnenglu.com/lymons/archive/2010/04/20/113099.html http://www.shnenglu.com/lymons/comments/113099.html http://www.shnenglu.com/lymons/archive/2010/04/20/113099.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/113099.html http://www.shnenglu.com/lymons/services/trackbacks/113099.html
鈶? 浠嶧ile涓昏彍鍗曚腑錛岄夋嫨new -> Projects鈥?, 鎵撳紑宸ョ▼鍒涘緩鍚戝瀵硅瘽妗嗐? 鈶? 鍦≒rojects鐨勫垪琛ㄦ涓紝閫夋嫨 Code::Blocks plugin 錛岀劧鍚庣偣鍑?Go 鎸夐挳錛岃繘鍏ユ彃浠跺垱寤哄悜瀵煎璇濇銆? 鈶? 鍒涘緩鍚戝鐨勭涓涓敾闈腑鏈夐噸瑕佷俊鎭鏄庛傝娉ㄦ剰鐨勬槸閲岄潰鎻愬埌浜嗗繀欏昏緗?cb, #wx榪欎袱涓叏灞鍙橀噺銆備笉榪囷紝榪樺ソ鍜變滑鍦ㄣ奀odeBlock鎻掍歡寮鍙戞寚鍗?涓銆嬩腑宸茬粡瀵硅繖涓や釜鍙橀噺榪涜浜嗚緗傚挶浠湪榪欓噷錛岀洿鎺ョ偣鍑籒ext榪涘叆鍒頒笅涓涓敾闈㈠嵆鍙?
闃呰鍏ㄦ枃 ]]> CodeBlocks鎻掍歡寮鍙戞寚鍗?涓) http://www.shnenglu.com/lymons/archive/2010/04/17/112850.htmllymons lymons Sat, 17 Apr 2010 08:22:00 GMT http://www.shnenglu.com/lymons/archive/2010/04/17/112850.html http://www.shnenglu.com/lymons/comments/112850.html http://www.shnenglu.com/lymons/archive/2010/04/17/112850.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/112850.html http://www.shnenglu.com/lymons/services/trackbacks/112850.html By Lymons(lymons@gmail.com) 2010/4/14
CodeBlocks鏄竴涓紭縐鐨凜/C++ IDE寮鍙戠幆澧?鍙﹀瀹冧篃鏄紑婧愮殑,涔熸槸璺ㄥ鉤鍙扮殑.浣犺兘澶熷埄鐢ㄥ畠鐨勬簮浠g爜榪涜浜屾寮鍙?涔熻兘涓哄畠鍒朵綔鑷繁鐨勬彃浠? 瀹冪殑GUI鏄埄鐢ㄤ簡璺ㄥ鉤鍙扮殑wxWidgets搴撴潵鍋氭垚鐨?鎵浠ュ畠鎵嶈兘澶熷疄鐜拌法騫沖彴.
涓嬮潰灝嗕粙緇岰odeBlock鐨勬彃浠跺埗浣滄柟娉?褰撶劧瀹冨繀欏誨緱閫氳繃緙栧啓鑷繁鐨勭▼搴忔墠鑳藉疄鐜?鎵浠ユ噦寰椾竴浜汣++鐨勭紪紼嬬煡璇嗚兘澶熷府浣犳洿瀹規(guī)槗鍘葷悊瑙e畠鐨勫唴瀹?
1錛?鍑嗗CodeBlocks鐨勫紑鍙戠幆澧?nbsp; 闃呰鍏ㄦ枃 ]]> W2K淇″彿(Signals)鐨勮澶囬┍鍔?/title> http://www.shnenglu.com/lymons/archive/2010/04/13/112426.htmllymons lymons Tue, 13 Apr 2010 02:29:00 GMT http://www.shnenglu.com/lymons/archive/2010/04/13/112426.html http://www.shnenglu.com/lymons/comments/112426.html http://www.shnenglu.com/lymons/archive/2010/04/13/112426.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/112426.html http://www.shnenglu.com/lymons/services/trackbacks/112426.html
Unix涓嬬殑淇″彿鎻愪緵浜嗕竴涓畝鍗曠殑IPC鏈哄埗錛屼篃灝辨槸褰撹繘紼嬫敹鍒頒竴涓俊鍙峰悗浼氬紓姝?asynchronous) 鍦拌皟鐢ㄤ綘鐨勪俊鍙峰鐞嗗嚱鏁?涔熷彨鍋氬彞鏌?錛屼笉綆′綘鐨勪唬鐮佹槸鍚﹀凡緇忓鍦ㄦ墽琛岀殑榪囩▼涔嬩腑銆?鑰屽湪Windows 2000(璇戣呮敞錛氱増鏈珮浜嶹2k鐨刉indows騫沖彴)涓嬪氨闇瑕佺敤鍒頒竴涓澶囬┍鍔紝浠ヤ究浣犺兘浣跨敤寮傛榪囩▼璋冪敤(asynchronous procedure calls , 綆縐癆PCs鎴栬匒PC) 鏉ヨ揪鎴愬悓鏍風殑鏁堟灉.
By Panagiotis E.
August 01, 2001
URL:http://www.ddj.com/windows/184416344
緲昏瘧錛歀ymons (lymons@gmail.com)
闃呰鍏ㄦ枃 ]]> 鍑芥暟鎸囬拡鏁欑▼ http://www.shnenglu.com/lymons/archive/2009/02/12/73604.htmllymons lymons Thu, 12 Feb 2009 08:08:00 GMT http://www.shnenglu.com/lymons/archive/2009/02/12/73604.html http://www.shnenglu.com/lymons/comments/73604.html http://www.shnenglu.com/lymons/archive/2009/02/12/73604.html#Feedback 4 http://www.shnenglu.com/lymons/comments/commentRss/73604.html http://www.shnenglu.com/lymons/services/trackbacks/73604.html
娉細鏅氭崋緇?late binding)鍙兘鏉ヨ嚜c++ 闃呰鍏ㄦ枃 ]]> 鐢╨ex/yacc鏉ヨВ鏋愰厤緗枃浠? http://www.shnenglu.com/lymons/archive/2009/02/02/72793.htmllymons lymons Mon, 02 Feb 2009 04:31:00 GMT http://www.shnenglu.com/lymons/archive/2009/02/02/72793.html http://www.shnenglu.com/lymons/comments/72793.html http://www.shnenglu.com/lymons/archive/2009/02/02/72793.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/72793.html http://www.shnenglu.com/lymons/services/trackbacks/72793.html 闃呰鍏ㄦ枃 ]]> RX-RPC鐨勫鎴風涓庢湇鍔″櫒绔殑閫氫俊瑙f瀽 http://www.shnenglu.com/lymons/archive/2009/02/02/72790.htmllymons lymons Mon, 02 Feb 2009 03:58:00 GMT http://www.shnenglu.com/lymons/archive/2009/02/02/72790.html http://www.shnenglu.com/lymons/comments/72790.html http://www.shnenglu.com/lymons/archive/2009/02/02/72790.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/72790.html http://www.shnenglu.com/lymons/services/trackbacks/72790.html 闃呰鍏ㄦ枃 ]]> 璺熺潃寮婧?鏉ュ涔犳簮C璇█浠g爜鐨勮娉?/title> http://www.shnenglu.com/lymons/archive/2009/02/01/72764.htmllymons lymons Sun, 01 Feb 2009 07:54:00 GMT http://www.shnenglu.com/lymons/archive/2009/02/01/72764.html http://www.shnenglu.com/lymons/comments/72764.html http://www.shnenglu.com/lymons/archive/2009/02/01/72764.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/72764.html http://www.shnenglu.com/lymons/services/trackbacks/72764.html
鐓х墖1鈼忋孋ode Reading鈥曡窡鐫寮婧愭潵瀛︿範杞歡鐨勫紑鍙戞妧娉曘? 銆榪欐湰涔︾殑鍓嶈█閲岋紝緙栫▼楂樻墜Dave Thomas鍐欎笅浜嗕笅闈㈢殑璇濄? 銆娌℃湁鐮旇榪囧叾浠栦綔瀹朵綔鍝佺殑浼熷ぇ浣滃錛屾病鏈夌爺絀惰繃鍏朵粬鐢誨絎旀硶鐨勪紵澶х敾瀹訛紝娌℃湁鐩楀彇榪囧茍鑲╀綔鎴樼殑鍚屼簨鐨勬妧鏈殑鎶宸ч珮鏄庣殑澶栫鍖葷敓錛屾病鏈夊湪鍓┚椹剁殑浣嶇疆縐瘡瀹為檯緇忛獙鐨勬嘗闊?67鐨勬満闀匡紝鍦ㄧ幇瀹炵敓媧諱腑鐪熺殑浼氬瓨鍦ㄤ粬浠繖鏍風殑浜哄悧錛?nbsp; 闃呰鍏ㄦ枃 ]]> 鍑嗗垯6錛氶伒瀹堝綰跨▼緙栫▼鐨勫父璇嗭紙涓嬶級 http://www.shnenglu.com/lymons/archive/2009/02/01/70835.htmllymons lymons Sun, 01 Feb 2009 07:41:00 GMT http://www.shnenglu.com/lymons/archive/2009/02/01/70835.html http://www.shnenglu.com/lymons/comments/70835.html http://www.shnenglu.com/lymons/archive/2009/02/01/70835.html#Feedback 1 http://www.shnenglu.com/lymons/comments/commentRss/70835.html http://www.shnenglu.com/lymons/services/trackbacks/70835.html
From 2008綺鵑?/a>
UNIX涓奀++紼嬪簭璁捐瀹堝垯(6)
鍑嗗垯6: 閬靛畧澶氱嚎紼嬬紪紼嬬殑甯歌瘑
瑕佸噯紜妸鎻″湪POSIX鏍囧噯鐨勫嚱鏁頒腑錛岄偅浜涘嚱鏁版槸闈炵嚎紼嬪畨鍏ㄧ殑錛屼竴瀹氫笉瑕佷嬌鐢?
瑕佽鑷繁緙栧啓鐨勫嚱鏁扮鍚堢嚎紼嬪畨鍏?
鍦ㄨ闂叡浜暟鎹?鍙橀噺涔嬪墠涓瀹氳鍏堥攣瀹?
濡傛灉浣跨敤C++鐨勮瘽錛屼竴瀹氳娉ㄦ剰鍑芥暟鐨勫悓姝ユ柟娉?
璇存槑: (2) 瑕佽鑷繁緙栧啓鐨勫嚱鏁扮鍚堢嚎紼嬪畨鍏?/p>
鍦ㄥ啓澶氱嚎紼嬬殑搴旂敤紼嬪簭鏃?鍦ㄥ涓嚎紼嬮噷鍏變韓鐨勫彉閲忚鍏堥攣瀹氱劧鍚庡湪鏇存柊瀹?銆傞偅涔堝湪澶氱嚎紼嬮噷鍏變韓鐨勫彉閲忎富瑕佹湁鍏ㄥ眬鍙橀噺鍜屽嚱鏁板唴鐨勯潤鎬佸彉閲忋傝屼笖,鍗充嬌鏄痵hort鍨嬪拰int鍨嬬殑鍏變韓鍙橀噺涔熻鍏堥攣瀹氬悗鏇存柊鎵嶈兘淇濊瘉鍏跺畨鍏ㄣ?/p>
鈥?璇︾粏鐨勬槸鍙傝?
榪樻湁,鍦ㄤ嬌鐢–++緙栫▼鐨勫満鍚堣娉ㄦ剰鍑芥暟鐨勬柟姝ユ柟娉曘備竴鑸殑璇存潵涓嬮潰鐨勫啓娉曟槸閿欒鐨勩?strong>Mutex鍦ㄥ嚱鏁板唴琚0鏄庢垚闈欐佸彉閲忔槸涓嶅厑璁哥殑銆?/p>
int incr_counter(void) { static Mutex m; // 榪欎箞鍐欎笉琛?br> m.Lock(); static int counter = 0; int ret = ++counter; m.Unlock(); return ret; }
搴旇鐢ㄤ笅闈㈢殑鏂瑰紡鏉ヤ唬鏇?
Mutex m; int incr_counter(void) { m.Lock(); // ...
鎶奙utex澹版槑鎴愬叏灞鍙橀噺鐨勮瘽姣旇緝濂?紼嶅井姣斾笂涓涓ソ)銆?/p>
鈥?璇︾粏鏄弬鑰?
UNIX涓奀++紼嬪簭璁捐瀹堝垯(6)-- 琛ヨ
綰跨▼瀹夊叏鍑芥暟鏄儚涓嬮潰閭f牱
涓嶈鎿嶄綔灞閮ㄧ殑闈欐佸彉閲?鍑芥暟鍐呯殑static鍨嬬殑鍙橀噺)鍜岄潪灞閮ㄧ殑闈欐佹暟鎹?鍏ㄥ眬鍙橀噺)銆傚茍涓?鍏跺畠鐨勯潪綰跨▼瀹夊叏鍑芥暟涓嶈璋冪敤
瑕佹搷浣滆繖鏍風殑鍙橀噺鐨勮瘽, 灝辮浣跨敤mutex榪涜鍚屾澶勭悊,鏉ラ檺鍒跺涓嚎紼嬪悓鏃跺瀹冭繘琛屾搷浣?
琚畾涔夌殑,浣嗘槸
鐗瑰埆鏄墠鑰? 鍜岃鍙仛鍙噸鍏ョ殑(reentrant)鍑芥暟鏈夊尯鍒?
鍙嶄箣, 鍚庤呯壒鍒槸鍜屽彨鍋?Serializable"(涓嶅崟鍗曟槸MT-Safe)"Safe"鐨勫嚱鏁版湁鍖哄埆
涔熸湁浠ヤ笂鐨勬儏鍐點傚湪Solaris鐨刴an鎵嬪唽閲? 鐢ㄥ悗鑰呯殑鏂瑰紡榪涜鍖哄埆. 浠庡綰跨▼紼嬪簭閲屽畨鍏ㄨ皟鐢ㄧ殑璇?灝卞彨鍋?Safe", 鑰屼笖, 鍦ㄥ綰跨▼涓兘澶熷茍鍙?concurrency)鍦版墽琛岃繖涓嚱鏁扮殑澶勭悊鐨勮瘽,濂藉儚 灝卞彨鍋?MT-Safe"銆?/p>
鍡? 鍥犱負姣旇緝璇︾粏鐨? 濡傛灉涓嶆槸鍦ㄥ浜庢墽琛岄熷害瑕佹眰姣旇緝鑻涘埢鐨勭幆澧冧腑緙栧啓浠g爜鐨勮瘽, 鍗曞崟鍦版剰璇嗗埌銆屾槸鍚︾嚎紼嬪畨鍏ㄣ嶅氨瓚沖浜?涓嶆槸鍚椼?/p>
]]>
鍑嗗垯6錛氶伒瀹堝綰跨▼緙栫▼鐨勫父璇嗭紙涓婏級 http://www.shnenglu.com/lymons/archive/2008/12/29/70678.htmllymons lymons Mon, 29 Dec 2008 09:11:00 GMT http://www.shnenglu.com/lymons/archive/2008/12/29/70678.html http://www.shnenglu.com/lymons/comments/70678.html http://www.shnenglu.com/lymons/archive/2008/12/29/70678.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/70678.html http://www.shnenglu.com/lymons/services/trackbacks/70678.html
From 2008綺鵑?/a>
UNIX涓奀++紼嬪簭璁捐瀹堝垯(6)
鍑嗗垯6: 閬靛畧澶氱嚎紼嬬紪紼嬬殑甯歌瘑
瑕佸噯紜妸鎻″湪POSIX鏍囧噯鐨勫嚱鏁頒腑錛岄偅浜涘嚱鏁版槸闈炵嚎紼嬪畨鍏ㄧ殑錛屼竴瀹氫笉瑕佷嬌鐢?
瑕佽鑷繁緙栧啓鐨勫嚱鏁扮鍚堢嚎紼嬪畨鍏?
鍦ㄨ闂叡浜暟鎹?鍙橀噺涔嬪墠涓瀹氳鍏堥攣瀹?
濡傛灉浣跨敤C++鐨勮瘽錛屼竴瀹氳娉ㄦ剰鍑芥暟鐨勫悓姝ユ柟娉?
璇存槑: (1) 瑕佸噯紜妸鎻¢偅浜涢潪綰跨▼瀹夊叏鐨勫嚱鏁幫紝涓瀹氫笉瑕佷嬌鐢?/p>
濡傛灉鍦≒OSIX騫沖彴涓婅繘琛屽綰跨▼緙栫▼鏃訛紝鏈夊嚑涓渶鍩烘湰鐨勭煡璇嗭紝涔熷氨鏄墍璇寸殑“甯歌瘑”錛屽笇鏈涘ぇ瀹朵竴瀹氳涓ユ牸閬靛畧銆?/p>
...棣栧厛銆佹垜浠鐞嗚В“綰跨▼瀹夊叏”鐨勬剰鎬濄傜嚎紼嬪畨鍏ㄧ殑鍑芥暟灝辨槸鎸囷紝“涓涓兘琚湪澶氫釜綰跨▼鍚屾椂璋冪敤涔熶笉浼氬彂鐢熼棶棰樼殑鍑芥暟”銆傝繖鏍風殑鍑芥暟閫氬父瑕佹弧瓚充互涓嬪嚑涓殑鐗硅川銆?/p>
涓嶈鎿嶄綔灞閮ㄧ殑闈欐佸彉閲?鍑芥暟鍐呯殑static鍙橀噺)鍜屽叏灞闈欐佹暟鎹?鍏ㄥ眬鍙橀噺錛屽嚱鏁板鐨勯潤鎬佸彉閲?銆傝屼笖錛屼篃涓嶈璋冪敤鍏朵粬鐨勯潪綰跨▼瀹夊叏鐨勫嚱鏁?
濡傛灉瑕佹搷浣滆繖鏍風殑鍙橀噺鐨勮瘽錛屼簨鍏堝繀欏諱嬌鐢ㄤ簰鏂ラ攣mutex榪涜鍚屾錛屽惁鍒欎竴瀹氳闄愬埗澶氫釜綰跨▼鍚屾椂瀵瑰畠鐨勮闂?
閭d箞銆佸湪POSIX鏍囧噯鐨勫嚱鏁伴噷闈紝涔熸湁涓嶆弧瓚充笂榪版潯浠剁殑銆傜敱浜庡巻鍙查仐鐣欓棶棰橈紝涓浜涘嚱鏁扮殑璇嗗埆鏍囪瘑(signature)鐨勫畾涔夋病鏈夎冭檻鍒扮嚎紼嬪畨鍏ㄧ殑闂錛屾墍浠ヤ笉綆℃庝箞鍋氶兘涓嶈兘婊¤凍涓婅堪鐨勬潯浠躲備緥濡傦紝鐪嬬湅 localtime鍑芥暟 鍚с傚畠鐨勫畾涔夌殑璇嗗埆鏍囪瘑錛坰ignature錛夊涓嬶細
struct tm *localtime(const time_t *timer);
localtime 鍑芥暟鏄紝鎶婁竴涓敤鏁存暟褰㈠紡琛ㄧず鐨勬椂鍒?浠?970/1/1鍒扮幇鍦ㄤ負姝㈢殑縐掓暟)銆佽漿鎹㈡垚涓涓兘璁╀漢瀹規(guī)槗鏄庣櫧鐨勫勾鏈堟棩褰㈠紡琛ㄧず鍑烘潵鐨則m緇撴瀯浣撳茍榪斿洖緇欒皟鐢ㄨ呯殑鍑芥暟銆傛牴鎹鏍艱鏄庛佽繑鍥炲嚭鏉ョ殑tm緇撴瀯浣撴槸涓嶉渶瑕乫ree()鎺夛紝涔熶笉鑳介噴鏀劇殑銆傝繖涓嚱鏁板吀鍨嬬殑瀹炵幇灝卞儚涓嬮潰鐨勪唬鐮侀偅鏍鳳細
struct tm *localtime(const time_t *timer) { static struct tm t; /* ... 浠巘imer鍙傛暟閲岀畻鍑哄勾鏈堟棩絳夋暟鍊?... */ t.tm_year = XXX; /* ...鎶婂畠浠~鍏ュ埌緇撴瀯浣撳唴... */ t.tm_hour = XXX; t.tm_min = XXX; t.tm_sec = XXX; return &t; }
榪欎釜鍑芥暟濡傛灉琚儚涓嬮潰閭f牱浣跨敤鐨勮瘽錛屽氨浼氭湁婕忔礊錛?/p>
鍦ㄧ嚎紼婣閲屾墽琛?ta = localtime(x);
鍦ㄧ嚎紼婤閲屾墽琛?tb = localtime(y);
綰跨▼A鍙傜収ta緇撴瀯浣撻噷鐨勬暟鎹?→ 灝卞彂鐜拌繖浜涙暟鎹槸涓浜涘鎬殑鍊鹼紒
...鍦ㄥ嚱鏁扮殑璇存槑鎵嬪唽閲屽榪欎釜闂涔熸病鏈夊仛榪囪緇嗙殑璇存槑銆傚叧浜庤繖涓紡媧烇紝鍦╨ocaltime鍑芥暟鍗充嬌浣跨敤浜唌utex閿佷篃涓嶈兘琚洖閬挎帀銆傛墍浠ワ紝榪欎釜鍑芥暟瀹氫箟鐨勮瘑鍒爣璇嗘槸涓嶈婊淬?br>[璇戣卨ymons娉細鍦ㄥ涓嚎紼嬮噷璋冪敤localtime鍑芥暟涔嬫墍浠ユ湁闂鐨勫師鍥犳槸錛宭ocaltime鍑芥暟閲岃繑鍥炵殑tm鏋勯犱綋鏄竴涓潤鎬佺殑緇撴瀯浣擄紝鎵浠ュ湪綰跨▼A閲岃皟鐢╨ocaltime鍑芥暟鏃訛紝璇ョ粨鏋勪綋琚祴浜堟紜殑鍊鹼紱鑰屽湪綰跨▼A鍙傜収榪欎釜緇撴瀯浣撲箣鍓嶏紝綰跨▼B鍙堣皟鐢╨ocaltime鐨勮瘽錛岃繖涓潤鎬佺殑緇撴瀯浣撳張琚祴浜堟柊鐨勪竴涓箋傚洜姝ゅ湪綰跨▼A瀵硅繖涓粨鏋勪綋鐨勮闂兘鏄熀浜庝竴涓敊璇殑鍊艱繘琛岀殑]
姝e洜涓哄姝わ紝灝卞儚涓婇潰璇磋繃鐨凱OSIX瑙勬牸(SUSv3)閲屾暣榻愮殑
asctime, basename, catgets, crypt, ctime, dbm_clearerr, dbm_close, dbm_delete, dbm_error, dbm_fetch, dbm_firstkey, dbm_nextkey, dbm_open, dbm_store, dirname, dlerror, drand48, ecvt, encrypt, endgrent, endpwent, endutxent, fcvt, ftw, gcvt, getc_unlocked, getchar_unlocked, getdate, getenv, getgrent, getgrgid, getgrnam,
(鐪佺暐)
瀵逛簬鍦ㄨ鏍間腑琚畾涔変負闈炵嚎紼嬪畨鍏ㄧ殑鍑芥暟錛屽簲璇ュ埗瀹氫竴涓伩鍏嶄嬌鐢ㄥ畠浠殑瑙勫垯鍑烘潵錛屽茍涓斿埗浣滀竴涓兘澶熻嚜鍔ㄦ鏌ュ嚭鏄惁浣跨敤浜嗚繖浜涘嚱鏁扮殑寮鍙戠幆澧冿紝搴旇鏄瘮杈冨ソ鐨勩?/p>
鍙嶄箣錛屽湪榪欓噷娌℃湁琚櫥杞界殑POSIX鏍囧噯鍑芥暟閮借鍋囧畾涓?"shall be thread-safe" 鐨勩佹墍浠ュ湪瀹為檯鐨勪嬌鐢ㄤ腑鍙互璁や負鍦ㄥ綰跨▼鐜閲屾槸娌℃湁闂鐨?鑰屼笖鍦ㄤ嬌鐢ㄧ殑騫沖彴涓婃病鏈夌壒鍒湴璇存槑瀹冩槸闈炵嚎紼嬪畨鍏ㄧ殑璇?銆?/p>
鍙﹀錛屾湁鍑犱釜闈炵嚎紼嬪畨鍏ㄧ殑鍑芥暟錛岄兘鍑嗗浜嗕竴涓鐢ㄧ殑綰跨▼瀹夊叏鐗堟湰鐨勫嚱鏁?浠呬粎鏄彉鏇翠簡鍑芥暟鐨勮瘑鍒爣璇?銆傚儚榪欎簺鍑芥暟涓轟簡涓庡師鐗堣繘琛屽尯鍒兘鍦ㄥ叾鍑芥暟鍚嶅悗闈㈡坊鍔犱簡 _r 榪欎釜鍚庣紑銆備緥濡傦紝asctime鍑芥暟灝辨湁綰跨▼瀹夊叏鐗堟湰鐨勫嚱鏁癮sctime_r銆傚湪瑙勬牸璇存槑涓槸鍚﹀畾涔変簡澶囩敤鍑芥暟錛屽彲浠ヨ瘯鐫鐐瑰嚮鍒氭墠鐨?a >閭d釜緗戦〉
閲岄潰鐨勫嚱鏁板悕灝卞彲浠ョ湅鍒般傜偣鍑?rand鍑芥暟 灝卞彲浠ョ湅鍒幫紝
[TSF] int rand_r(unsigned *seed);
鐢╗TSF]榪欐牱鐨勬枃瀛楁爣璁板嚭鏉ョ殑鍑芥暟鍚с傝繖灝辨槸澶囩敤鍑芥暟銆傚湪涓瑙堜腑娌℃湁璁拌澆鍑烘潵鐨勫嚱鏁?澶囨敞錛?紼嶅井鏈夌偣鍎垮嚭鍏ャ傝鍙傜収榪欓噷 )銆佹嵁鎴戞墍鐭ヨ繕鏈変笅闈㈢殑澶囩敤鍑芥暟銆?/p>
asctime_r, ctime_r, getgrgid_r, getgrnam_r, getpwnam_r, getpwuid_r, gmtime_r, localtime_r, rand_r, readdir_r, strerror_r, strtok_r
榪樻湁錛屽湪瑙勬牸浠ュ錛岃繕鍑嗗浜嗗緢澶氱殑涓嬮潰閭f牱鐨勫嚱鏁般?/p>
gethostbyname_r, gethostbyname2_r
鍦ㄦ渶榪戠殑鎿嶄綔緋葷粺涓佷篃浣跨敤 getaddrinfo API鍑芥暟鏉ヨВ鍐矷Pv6鍚嶅瓧瀵瑰簲鐨勯棶棰樸俫ethostbyname緋誨垪鐨凙PI閮芥槸姣旇緝闄堟棫鐨勫嚱鏁頒簡銆佹墍浠ヤ嬌鐢ㄥ墠闈㈢殑鍑芥暟榪樻槸姣旇緝濂藉惂銆傛牴鎹鏍糞USv3錛実etaddrinfo涔熸槸綰跨▼瀹夊叏鐨勶細
The freeaddrinfo() and getaddrinfo() functions shall be thread-safe.
鍦ㄥ綰跨▼緙栫▼涓紝涓嶈浣跨敤闈炵嚎紼嬪畨鍏ㄧ殑鍑芥暟錛岃屼粬浠殑澶囩敤鍑芥暟鍙互鏀懼績鍦扮Н鏋佺殑鍘諱嬌鐢ㄣ?/p>
→鍚庣畫
]]> 鍑嗗垯5錛氬敖鍙兘閬垮厤綰跨▼鐨勫歡榪熸挙閿澶勭悊 http://www.shnenglu.com/lymons/archive/2008/12/25/70227.htmllymons lymons Thu, 25 Dec 2008 06:08:00 GMT http://www.shnenglu.com/lymons/archive/2008/12/25/70227.html http://www.shnenglu.com/lymons/comments/70227.html http://www.shnenglu.com/lymons/archive/2008/12/25/70227.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/70227.html http://www.shnenglu.com/lymons/services/trackbacks/70227.html
From 2008綺鵑?/a>
[C++ ] UNIX涓奀++紼嬪簭璁捐瀹堝垯(5)
鍑嗗垯5: 灝藉彲鑳介伩鍏嶇嚎紼嬩腑鍋氬歡榪熸挙閿鐨勫鐞?br>
綰跨▼鐨勫紓姝ユ挙娑堟槸鎸囷細涓涓嚎紼嬪彂鍑轟腑鏂叾浠栫嚎紼嬬殑澶勭悊鐨勪竴涓姩浣?
寤惰繜鎾ゆ秷鍥犱負鏄鏍艱嚜鐢卞害姣旇緝楂樸佹墍浠ユ牴鎹甇S鍜孋搴撳嚱鏁扮殑鐗堟湰瀹冧篃鏈夊悇寮忓悇鏍風殑鍔ㄤ綔
瑕佹兂鍦ㄤ笉鍚岀殑鐜涓嬮兘鑳界ǔ瀹氱殑鍔ㄤ綔鐨勮瘽錛屽氨蹇呴』瑕佽緇嗚皟鏌ヨ繍琛岀幆澧冨拰錛屽C搴撳嚱鏁拌繘琛屾娊璞″寲錛屽仛蹇呰鐨勬潯浠剁紪璇?
鍦–++涓併屾挙娑堝彂鐢熸椂鐨勫璞¢噴鏀俱嶇殑瀹炵幇涓嶅叿鏈夊彲縐繪鎬?
綰跨▼鎾ら攢瑕佹厧閲嶄嬌鐢ㄣ傚湪C++閲屼笉瑕佷嬌鐢?
璇存槑:
鍦ㄥ墠闈㈡垜浠凡緇忚榪囷紝綰跨▼鐨勬挙娑堝垎涓恒屽紓姝ャ嶃屽歡榪熴嶈繖涓ょ綾誨瀷銆佸茍涓斻屽紓姝ユ挙娑堛嶄篃鏄潪甯稿鏄撳紩璧峰悇縐嶅鏉傞棶棰樼殑鍏冨嚩銆?/p>
閭d箞錛岀幇鍦ㄨ鍦ㄧ▼搴忎腑闄ゆ帀銆屽歡榪熸挙娑堛嶃傚歡榪熸挙娑堣櫧鐒朵笉浼氬儚寮傛鎾ゆ秷閭f牱浼氬紩璧峰悇縐嶅悇鏍風殑闂銆佷絾鏄佹敞鎰忎簨欏硅繕鏄湁寰堝鐨勩傚彧鏈夋妸涓嬮潰鐨勮繖浜涙敞鎰忎簨欏瑰叏閮ㄩ兘鎶婃彙涔嬪悗鎵嶈兘鏀懼績浣跨敤銆?/p>
娉ㄦ剰浜嬮」1: 瑕佸ソ濂芥妸鎻℃挙娑堢偣
鍜屽紓姝ユ挙娑堜笉涓鏍風殑鏄佹挙娑堝鐞嗕竴鐩翠細琚歡榪熷埌鍦ㄤ唬鐮佷笂鏄庣ず鍑烘潵鐨勬挙娑堢偣涔嬪悗鎵嶄細琚墽琛屻傚鏋滅紪鍐欎簡涓涓叿鏈夊歡榪熸挙娑堝彲鑳界殑浠g爜銆佷唬鐮佷腑鐨勯偅鏉¤鍙ユ槸鎾ゆ秷鐐廣佸繀欏昏姝g‘鐨勬妸鎻°?/p>
棣栧厛銆佽皟鐢ㄨ繃pthread_testcancel鍑芥暟鐨勫湴鏂瑰氨鍙樻垚鎾ゆ秷鐐逛簡銆傚綋鐒惰繖涓嚱鏁版槸銆佷粎浠呬負浜嗐屽彉鎴愬歡榪熸挙娑堛嶇殑鐩殑鑰岃緗嚭鏉ョ殑鍑芥暟銆傞櫎姝や箣澶栥佹煇浜涙爣鍑嗗簱鍑芥暟琚皟鐢ㄥ悗浼氫笉浼氬彉鎴愭挙娑堢偣鏄湪瑙勬牸(SUSv3)涓喅瀹氱殑銆?a >璇峰弬鐓ц鏍艱鏄?/a>銆佹湁涓嬮潰鐨勫嚱鏁頒竴瑙堛?/p>
涓嬮潰鐨勫嚱鏁?span style="FONT-WEIGHT: bold">鏄?/span>鎾ゆ秷鐐?strong> accept, aio_suspend, clock_nanosleep, close, connect, creat, fcntl, fdatasync, fsync, getmsg, getpmsg, lockf, mq_receive, mq_send, mq_timedreceive, mq_timedsend, msgrcv, msgsnd, msync, nanosleep, open, pause, poll, pread, pselect, pthread_cond_timedwait, pthread_cond_wait, pthread_join, pthread_testcancel, putmsg, putpmsg, pwrite, read, readv, recv, recvfrom, (鐣?
涓嬮潰鐨勫嚱鏁?span style="FONT-WEIGHT: bold">涓嶆槸鎾ゆ秷鐐?strong> access, asctime, asctime_r, catclose, catgets, catopen, closedir, closelog, ctermid, ctime, ctime_r, dbm_close, dbm_delete, dbm_fetch, dbm_nextkey, dbm_open, dbm_store, dlclose, dlopen, endgrent, endhostent, endnetent, endprotoent, endpwent, endservent, endutxent, fclose, fcntl, fflush, fgetc, fgetpos, fgets, fgetwc, fgetws, fmtmsg, fopen, fpathconf, fprintf, fputc, fputs, fputwc, fputws, (鐣?
鐪嬪埌榪欎簺鎴戞兂宸茬粡鏄庣櫧浜嗐佷絾鏄湪瑙勬牸涓篃璇存槑浜嗐岃兘鍚︽垚涓烘挙娑堢偣璺熷叿浣撶殑瀹炵幇鐩稿叧鐨勫嚱鏁般嶄篃鏄鏁板瓨鍦ㄧ殑銆傚師鍥犳槸銆佷負浜嗗彲縐繪鎬с佷繚璇併屽湪涓瀹氱殑鏃墮棿鍐呰綰跨▼鐨勫歡榪熸挙娑堝畬鎴愩嶆槸寰堝洶闅劇殑浜嬫儏銆傚仛鐨勪笉濂界殑璇濄佸彧瑕佺◢寰竴鎻愬崌OS鐨勭増鏈氨鍙兘璁╁仛鍑烘潵鐨勭▼搴忎駭鍝佷笉鑳藉姩浣溿?/p>
鍗充嬌鏄繖鏍烽偅榪樻兂瑕佷嬌鐢ㄥ歡榪熸挙娑堝悧錛?/p>
娉ㄦ剰浜嬮」2: 瀹炵幇瑕佺煡閬揷leanup鍑芥暟鐨勫繀瑕佹?/strong>
鍙兘琚歡榪熸挙閿鐨勭嚎紼嬪湪榪愯鐨勮繃紼嬩腑錛岃鐢寵璧勬簮鐨勫満鍚堬紝涓瀹氳鑰冭檻鍒頒互涓嬬殑鍑犵偣錛屽惁鍒欏氨浼氱紪鍒跺嚭鍚湁璧勬簮涓㈠け鍜屾閿佺殑杞歡浜у搧銆?/p>
渚嬪緙栧啓鐨勪笅闈㈢殑鍑芥暟灝變笉鑳借瀹夊叏鐨勫歡榪熸挙閿鎺夈?/p>
void* cancel_unsafe(void*) { static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&mutex); // 姝ゅ涓嶆槸鎾ゆ秷鐐?br> struct timespec ts = {3, 0}; nanosleep(&ts, 0); // 緇忓父鏄挙娑堢偣 pthread_mutex_unlock(&mutex); // 姝ゅ涓嶆槸鎾ゆ秷鐐?br> return 0; } int main(void) { pthread_t t; // pthread_create鍚庨┈鍙戜笂鏀跺埌涓涓湁鏁堢殑寤惰繜鎾ゆ秷鐨勮姹?br> pthread_create(&t, 0, cancel_unsafe, 0); pthread_cancel(t); pthread_join(t, 0); cancel_unsafe(0); // 鍙戠敓姝婚攣錛?br> return 0; }
鍦ㄤ笂闈㈢殑鏍蜂緥浠g爜涓乶anosleep鎵ц鐨勮繃紼嬩腑緇忓父浼氳Е鍙戝歡榪熸挙閿鐨勬渶緇堝姩浣滐紝浣嗘槸榪欎釜鏃跺欑殑mutex閿佽繕澶勪簬琚攣瀹氱殑鐘舵併傝屼笖銆佺嚎紼嬩竴琚歡榪熸挙娑堢殑璇濆氨鎰忓懗鐫娌℃湁浜哄幓閲婃斁鎺夎繖涓簰鏂ラ攣浜?span class=footnote>*2 銆傚洜姝ゃ佸湪涓嬮潰鐨刴ain鍑芥暟涓皟鐢ㄥ悓鏍風殑cancel_unsafe鍑芥暟鏃跺氨浼氬紩璧鋒閿佷簡銆?/p>
涓轟簡鍥為伩榪欎釜闂銆佸埄鐢╬thread_cleanup_push鍑芥暟鍦ㄦ挙娑堟椂閲婃斁鎺変簰鏂ラ攣鐨勮瘽灝監(jiān)K浜嗭紝涔熷氨涓嶄細姝婚攣浜嗐?/p>
// 鏂板娓呴櫎鍑芥暟 void cleanup(void* mutex) { pthread_mutex_unlock((pthread_mutex_t*)mutex); } // 綺椾綋瀛楅儴鍒嗘槸鏂板鐨勮鍙?br>void* cancel_unsafe(void*) { static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cleanup_push(cleanup, &mutex); pthread_mutex_lock(&mutex); struct timespec ts = {3, 0}; nanosleep(&ts, 0); pthread_mutex_unlock(&mutex); pthread_cleanup_pop(0); return 0; }
娉ㄦ剰浜嬮」3: 瀹炵幇瑕佹竻妤氬歡榪熸挙娑堝拰C++涔嬮棿鐨勫吋瀹瑰害
浣跨敤C璇█鐨勫満鍚堬紝鍒╃敤涓婇潰鐨刾thread_cleanup_push/pop鍑芥暟灝辮兘瀹夊叏鍦版墽琛屽歡榪熸挙娑堢殑鍔ㄤ綔錛屼絾鏄湪C++璇█鐨勫満鍚堝氨浼氬嚭鐜板叾浠栫殑闂銆?strong>C++涓庡歡榪熸挙娑堜箣闂寸殑鍏煎搴︽槸闈炲父宸殑銆傚叿浣撶殑琛ㄧ幇鏈変互涓嬩袱涓棶棰?
鎵ц寤惰繜鎾ゆ秷鐨勬椂鍊欙紝鍐呭瓨鏍堜笂鐨勫璞$殑鏋愭瀯鍑芥暟浼氫笉浼氳璋冪敤璺熷叿浣撶殑寮鍙戠幆澧冩湁鍏崇郴
GCC3鐗堟湰灝變笉浼氳皟鐢ㄣ?
Solaris鍜孴ru64 UNIX涓嬬殑鍘熺敓緙栬瘧鍣ㄧ殑鍦哄悎錛屽氨璋冪敤鏋愭瀯鍑芥暟(濂藉儚)
pthread_cleanup_push/pop鍑芥暟鍜孋++鐨勫紓甯稿鐞嗘満鍒朵箣闂存湁鐫鎬庢牱鐨勭浉浜掑獎鍝嶄篃鑳藉叿浣撶幆澧冩湁鍏?
涓嶈皟鐢ㄦ瀽鏋勫嚱鏁幫紝鎴栬呭湪鎶涘嚭寮傚父鐨勬椂鍊欎笉鑳藉仛cleanup澶勭悊錛岀粡甯告槸鍙戠敓鍐呭瓨娉勬紡錛岃祫婧愪涪澶憋紝紼嬪簭宕╂簝錛屾閿佺瓑鐜拌薄鐨勫師鍥犮備護浜烘剰澶栫殑鏄浜庤繖涓繁灞傛鐨勯棶棰橈紝灝辮繛Boost C++搴?/a>閮芥潫鎵嬫棤絳栥?/p>
[Q] Why isn't thread cancellation or termination provided?
[A] There's a valid need for thread termination, so at some point Boost.Threads probably will include it, but only after we can find a truly safe (and portable) mechanism for this concept.
鍏堝繀欏葷‘淇濆璞$殑鑷敱瀛樺偍錛岃屽悗鍏ㄩ兘璁ヽleanup鍑芥暟鍘婚噴鏀懼璞$殑鏂規(guī)硶涔熸湁錛屼絾鏄繖嬈℃槸鐗虹壊浜嗗紓甯稿畨鍏ㄦс?br>錛堝師鏂囨病鏈夌湅鏄庣櫧錛氥偑銉栥偢銈с偗銉堛倰蹇呫仛銉曘儶銉箋偣銉堛偄涓娿伀紕轟繚銇椼佽В浣撱倰鍏ㄣ仸銆併偗銉兗銉熾儕銉冦儣銉忋兂銉夈儵銇銈忋仜銈嬫墜銈傘亗銈娿伨銇欍亴銆佷粖搴︺伅渚嬪瀹夊叏鎬с亴鐘犵壊銇仾銈嬨仹銇椼倗銇嗐傦級
搴旇璇寸殑鏄紝鍦ㄤ嬌鐢–++鐨勫伐紼嬮噷涓嶅綰跨▼榪涜寤惰繜鎾ゆ秷澶勭悊榪樻槸姣旇緝瀹為檯鐨勩?/p>
]]>
鍑嗗垯4錛氳涓嶈鍋氱嚎紼嬬殑寮傛鎾ゆ秷鐨勮璁?/title> http://www.shnenglu.com/lymons/archive/2008/12/19/69810.htmllymons lymons Fri, 19 Dec 2008 03:01:00 GMT http://www.shnenglu.com/lymons/archive/2008/12/19/69810.html http://www.shnenglu.com/lymons/comments/69810.html http://www.shnenglu.com/lymons/archive/2008/12/19/69810.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/69810.html http://www.shnenglu.com/lymons/services/trackbacks/69810.html
From 2008綺鵑?/a>
鍘熸枃鍦板潃錛歨ttp://d.hatena.ne.jp/yupo5656/20040724/p1
鈻?/span> [C++ ] UNIX涓婄殑C++紼嬪簭璁捐瀹堝垯 (4)
閾佸垯4: 璇蜂笉瑕佸仛綰跨▼鐨勫紓姝ユ挙娑堢殑璁捐
綰跨▼鐨勫紓姝ユ挙閿鏄寚錛?鏌愪釜綰跨▼鐨勬墽琛?span style="FONT-WEIGHT: bold">绔嬪埢琚叾浠栫嚎紼嬬粰寮哄埗緇堟浜?
璇蜂笉瑕佸崟鍗曚負浜嗚“璁捐鏇寸畝鍗?#8221;鎴栬?#8220;鐪嬭搗浜嗘洿綆鍗?#8221;鑰屼嬌鐢ㄧ嚎紼嬬殑寮傛鎾ゆ秷
鍜嬩竴鐪嬭繕鏄尯綆鍗曠殑銆備絾鏄悶涓嶅ソ鍙兘浼氬紩璧峰悇縐嶅悇鏍風殑闂銆傝涓嶈鍦ㄤ笉鑳芥妸鎻¢棶棰樼殑瀹炶川灝卞仛鍑轟嬌鐢ㄧ嚎紼嬬殑寮傛鎾ゆ秷鐨勮璁★紒
鍦╬thread鐨勮鏍艱鏄庝腑錛屽厑璁鎬竴涓嚎紼嬪彲浠ュ己鍒朵腑鏂煇涓嚎紼嬬殑鎵ц銆傝繖灝辨槸鎵璇寸殑寮傛鎾ゆ秷銆?/p>
綰跨▼鐨勬挙娑堟湁涓嬮潰鐨勪袱縐嶆柟寮忋?/p>
鏂瑰紡1錛?寮傛鎾ゆ秷(PTHREAD_CANCEL_ASYNCHRONOUS)
鏂瑰紡2錛?寤惰繜鎾ら攢(PTHREAD_CANCEL_DEFERRED)
鎾ゆ秷鍔ㄤ綔錛屾槸璁╃嚎紼嬬殑澶勭悊涓鐩磋寤惰繜鍒版挙娑堢偣鎵嶄細鍘繪墽琛?
榪樻湁錛屽埌搴曟槸鐢ㄥ摢縐嶆挙娑堟柟寮忥紝涓嶆槸鎾ゆ秷渚э紝鑰屾槸琚挙閿渚ц兘澶熷喅瀹氱殑銆傚彟澶栵紝鍦ㄨ鎾ら攢渚т篃鑳藉閫夋嫨瀹屽叏紱佹鎾ゆ秷鐨勮繖縐嶆柟寮?銆?/p>
浼氶犳垚浠涔堥棶棰樺憿
閭d箞錛岃鎴戠湅鐪嬩貢鐢ㄧ嚎紼嬬殑寮傛鎾ゆ秷浼氬紩璧蜂粈涔堥棶棰樺憿銆傜湅榪囧噯鍒?鐨勪漢鍙兘浼氱煡閬擄紝鍦ㄤ笅闈㈢殑鑴氭湰閲岋紝琚挙閿綰跨▼浠ュ鐨勪換鎰忎竴涓嚎紼嬩細琚閿併?/p>
綰跨▼1涓皟鐢╩alloc鍑芥暟姝e湪鍋氬唴瀛樺垎閰嶇殑榪囩▼涓紝綰跨▼2寮傛鎾ゆ秷浜嗙嚎紼?鐨勫鐞?
綰跨▼1椹笂琚挙閿錛屼絾鏄痬alloc鍑芥暟涓殑浜掓枼閿佸氨娌℃湁綰跨▼鍘昏В闄や簡
鍚庨潰鐨勪換鎰忎竴涓嚎紼嬪鏋滃啀嬈¤皟鐢╩alloc鍑芥暟鐨勮瘽灝變細椹笂瀵艱嚧璇ョ嚎紼嬫閿?
鍦ㄨ繖涓緥瀛愪腑浣跨敤浜唌alloc鍑芥暟錛屼絾鏄叾浠栫殑鍗遍櫓鍑芥暟榪樻湁寰堝銆?/p>
鍙嶄箣錛屽嵆浣垮仛浜嗗紓姝ユ挙娑堜篃娌℃湁闂鐨勫嚱鏁頒篃鏈夊皯鏁板瓨鍦ㄧ殑銆佹垜浠妸瀹冧滑鍙仛銆宎sync-cancel safe鍑芥暟銆嶆垨鑰呫屽紓姝ユ挙娑堝畨鍏ㄥ嚱鏁般嶃傚湪涓浜涘晢鐢║NIX涓丱S鎻愪緵鐨刟pi鍑芥暟鐨勬枃妗h鏄庝腑鏈塧sync-cancel safety鐨勮杞姐佷絾鏄湪Linux(glibc)閲屽氨寰堥仐鎲撅紝鍑犱箮娌℃湁鐩稿叧鐨勮鏄庛?/p>
鍦ㄨ繖鍎匡紝鍙傜湅瑙勬牸(SUSv3)鐨勮瘽錛屼細鍙戠幇錛屻?a >鎻忚堪寮傛鎾ゆ秷瀹夊叏鐨勫嚱鏁板彧鏈?涓?/a>銆?/p>
pthread_cancel
pthread_setcancelstate
pthread_setcanceltype
鑰屼笖銆侀噷闈㈣繕鏈?No other functions are required to be async-cancel-safe"榪欐牱鐨勮杞姐傚洜姝わ紝Linux鐨勫満鍚堬紝濡傛灉鍦ㄦ枃妗i噷娌℃湁璁拌澆鎴恆sync-cancel safety鐨勫嚱鏁幫紝鎴戜滑榪樻槸鎶婂畠鍋囧畾鎴愪笉瀹夊叏鐨勫嚱鏁頒負濂?
濡備綍閬垮厤榪欎簺闂鍛?/h4>
鍦ㄥ綰跨▼緙栫▼涓負浜嗗畨鍏ㄧ殑浣跨敤寮傛鎾ゆ秷澶勭悊銆佹湁娌℃湁鍥為伩姝婚攣鐨勬柟娉曞憿錛熸垜浠瘯鐫鎯充簡鍑犱釜銆備粬浠笌鍑嗗垯3閲岀殑綰跨▼+fork鐨勫満鍚堢殑鍥為伩絳栧緢鐩鎬技銆?/p>
鍥為伩鏂規(guī)硶1: 琚挙閿綰跨▼涓紝鍙兘浣跨敤寮傛鎾ゆ秷瀹夊叏鍑芥暟
棣栧厛錛岃鎾ら攢綰跨▼涓紝鍙兘浣跨敤寮傛鎾ゆ秷瀹夊叏鍑芥暟銆備絾鏄繖涓柟娉?/p>
鍦ㄨ鏍艱鏄庝腑鍙湁3涓紓姝ユ挙娑堝畨鍏ㄧ殑鍑芥暟
榪欎簺浠ュ鐨勫嚱鏁版槸涓嶆槸寮傛鎾ゆ秷瀹夊叏(鍟嗙敤UNIX)銆佸洜涓烘病鏈夎鏄庢枃妗f垜浠笉娓呮(Linux)
涓湁浠ヤ笂鐨勪袱鐐癸紝鎵浠ヨ繖涓洖閬挎柟娉曞嚑涔庝笉鐜板疄銆?/p>
鍥為伩鏂規(guī)硶2: 琚挙閿綰跨▼涓紝鍦ㄥ仛闈炲紓姝ユ挙娑堝畨鍏ㄥ鐞嗙殑榪囩▼涓紝鍐嶆妸鎾ゆ秷鏂瑰紡璁劇疆鎴愩屽歡榪熴嶆垨鑰呮槸銆岀姝€?/strong>
絎簩涓槸錛岃鎾ら攢綰跨▼鍦ㄥ仛闈炲紓姝ユ挙娑堝畨鍏ㄥ鐞嗙殑榪囩▼涓紝鎶婃挙娑堟柟寮忓啀璁懼畾鎴愩屽歡榪熴嶆垨鑰呫岀姝€嶃傚浜庤繖涓柟娉?/p>
灝卞儚鏂規(guī)硶1鍐欑殑閭f牱銆佽鎶婃垜閭d釜鍑芥暟鏄紓姝ユ挙娑堝畨鍏ㄧ殑涓鏃惰繕鏄尯楹葷儲鐨?
鍦ㄤ換鎰忕殑鍦烘墍騫朵笉鑳戒繚璇佹挙娑堝姩浣滀細琚┈涓婃墽琛?
渚嬪錛屽啀璁懼畾鎴愩屽歡榪熴嶅悗鐨勪竴孌墊椂闂村唴濡傛灉鎾ゆ秷鍙戠敓鏃躲佹煇涓鍦ㄩ樆濉炵殑I/O鍑芥暟鏄惁鑳藉琚В闄ら樆濉炶繕鏄尯寰鐨?
濡傛灉璁懼畾鎴愭挙娑堢姝㈢殑璇濓紝鍒欐挙娑堜細琚睆钄芥帀
鏈変笂闈㈡牱鐨勯棶棰樸佷細瀵艱嚧銆屼竴綺懼績璁捐鎾ゆ秷鏂瑰紡鐨勬浛鎹紝浠庝竴寮濮嬪氨浣跨敤寤惰繜鎾ゆ秷榪樹笉澶熷ソ銆嶈繖鏍風殑緇撴灉銆傛墍浠ヨ繖鍑犱箮鏄笉濂界殑涓涓洖閬跨瓥銆?/p>
鍥為伩鏂規(guī)硶3錛?浣跨敤pthread_cleanup_push鍑芥暟錛岀櫥褰曞紓姝ユ挙娑堟椂鐨勭嚎紼嬫暟鎹竻闄ょ殑鍥炶皟鍑芥暟
絎笁縐嶅垯鏄紝鐢╬thread_cleanup_push鍑芥暟銆佺櫥褰曚竴涓湪寮傛鎾ゆ秷鍙戠敓鏃剁殑鏁版嵁娓呴櫎鐨勫洖璋冨嚱鏁般傝繖鍜屽湪鍑嗗垯3涓粙緇嶇殑pthread_atfork鍑芥暟鏈夌偣鍎跨被浼箋傜敤榪欎釜鍑芥暟鐧誨綍鐨勫洖璋冨嚱鏁版潵娓呴櫎綰跨▼鐨勬暟鎹拰閿侊紝灝卞彲浠ュ洖閬挎閿佷簡銆?/p>
...浣嗘槸錛宲thread_cleanup_push鍑芥暟鐧誨綍鐨勫洖璋冨嚱鏁幫紝鍦ㄣ屽歡榪熸挙娑堛嶇殑鍦哄悎鏄笉鑳借璋冪敤鐨勩傚洜姝ゃ佽繖涓洖閬挎柟娉曞浜庡紓姝ユ挙娑堟病鏈変粈涔堝ぇ鐨勪綔鐢ㄣ?/p>
鍥為伩鏂規(guī)硶錛旓細 涓嶈鎵ц寮傛鎾ゆ秷澶勭悊
鏈鍚庢槸銆佷笉瑕佹墽琛屽紓姝ユ挙娑堝鐞嗐傚弽鑰屼唬涔嬬殑鏄?/p>
璁捐鎴愪笉渚濊禆浣跨敤寮傛鎾ゆ秷閭f牱鐨勫鐞?
鎴栬?br>
涓嶅緱涓嶄嬌鐢ㄧ嚎紼嬫挙娑堢殑璇濄佷笉鍋氬紓姝ユ挙娑堣屼綔寤惰繜鎾ゆ秷鐨勫鐞?
榪欐槸姣旇緝瀹為檯鐨勫仛娉曪紝鏄垜浠煎緱鎺ㄨ崘鐨勩?/p>
]]> 鍑嗗垯1錛氫笉渚濊禆浜庝俊鍙鋒敹鍙戠殑璁捐 http://www.shnenglu.com/lymons/archive/2008/06/01/51838.htmllymons lymons Sun, 01 Jun 2008 12:27:00 GMT http://www.shnenglu.com/lymons/archive/2008/06/01/51838.html http://www.shnenglu.com/lymons/comments/51838.html http://www.shnenglu.com/lymons/archive/2008/06/01/51838.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/51838.html http://www.shnenglu.com/lymons/services/trackbacks/51838.html
From 2008綺鵑?/a>
鈻?/u> [ C++ ] UNIX涓婄殑C++紼嬪簭璁捐瀹堝垯(1)
鍘熸枃:http://d.hatena.ne.jp/yupo5656/20040712/p1
Unix璺焀indows絳夐偅浜?#8221;瀵逛簬寮鍙戣呮槗浜庝嬌鐢?#8221;鐨凮S姣旇搗鏉ワ紝鍦ㄤ俊鍙峰拰綰跨▼鐨勫埄鐢ㄦ柟闈㈡湁璇稿鐨勯檺鍒躲備絾鏄嵆浣夸笉鐭ラ亾榪欎簺鐭ヨ瘑灝卞仛鏋勬灦璁捐鍜屽疄鐜扮殑鎯呭喌涔熼殢澶勫彲瑙併傝繖涓氨鏄偅浜涚粡甯鎬笉鑳藉啀鐜扮殑bug鐨勬俯搴婂惂銆?/p>
鍥犳錛屾垜鎯沖垎鎴愬嚑鍥炴潵鍐欎竴浜涘噯鍒欐潵闃叉闄峰叆鍒拌繖浜涘湀濂楅噷銆?strong>
鍑嗗垯 1 錛氫笉渚濊禆浜庝俊鍙鋒敹鍙戠殑璁捐
·緇欏叾浠栬繘紼嬩互鍙婅嚜宸卞彂閫佸紓姝ヤ俊鍙峰茍鏀瑰彉澶勭悊嫻佺▼鐨勮璁′笉瑕佸仛
寮傛淇″彿鏄肩敤kill緋葷粺璋冪敤鏉ュ垱寤?鍙戦佺殑淇″彿銆佷緥濡係IGUSR1,SIGUSR2,SIGINT,SIGTERM 絳?
綆鍗曠殑浣跨敤蹇界暐淇″彿(SIG_IGN)鍒欐病鏈夐棶棰?
·涓嶈鎶婄嚎紼嬪拰淇″彿涓璧蜂嬌鐢?nbsp;
榪欏皢浣跨▼搴忓姩浣滅殑棰勬祴鍜岃皟璇曞彉寰楀緢鍥伴毦
璇存槑錛?/p>
鍚屾淇″彿鏄寚錛屽洜涓烘煇浜涚壒瀹氱殑鎿嶄綔*1 鑰屽紩璧峰悜鑷韓榪涚▼鍙戦佹煇浜涚壒瀹氱殑淇″彿錛屼緥濡係IGSEGV,SIGBUS,SIGPIPE,SIGSYS,SIGILL,SIGFPE銆傚紓姝ヤ俊鍙峰氨鏄繖浜涗互澶栫殑淇″彿銆傚湪浠涔堟椂鏈哄彂閫佸紓姝ヤ俊鍙峰茍涓嶈兘琚嫻嬪嚭鏉ャ傛垜浠細鍦ㄧ▼搴忛噷榪藉姞鏀跺埌鏌愪簺淇″彿鏃跺仛涓浜涚壒孌婂鐞?淇″彿澶勭悊鍑芥暟)鐨勫嚱鏁般傞偅涔堟牴鎹敹鍒扮殑淇″彿灝辮煩鍒頒俊鍙峰鐞嗗嚱鏁扮殑紼嬪簭灝卞彨鍋?#8221;鍦ㄤ換鎰忎唬鐮佸閮借兘鍙戠敓璺寵漿”鐨勭▼搴忋傝繖鏍風殑紼嬪簭寰寰闅愯棌榪欎笅闈㈢殑閭d簺闂錛?/p>
瀹規(guī)槗寮曞叆 BUG 銆?#8221;浠繪剰鐨勪唬鐮?#8221;铏界劧涔熷寘鍚?#8221;鎵цC/C++閲岄潰鐨勪竴鏉¤鍙ョ殑榪囩▼涓?#8221;鐨勬剰鎬濓紝浣嗚繖寰堝鏄撹煩鍑虹▼搴忓憳鐨勬甯告濈淮浠ュ強榛樿鐨勫亣瀹氭潯浠躲傜紪鍐欑▼搴忕殑鏃跺欏線寰闇瑕佽冭檻姣擟++寮傚父鍒嗘敮榪樿澶氬緱澶氱殑鍒嗘敮鎯呭喌銆?
浣挎祴璇曢」鐩縺澧?/strong>銆傚嵆浣挎牴鎹櫧鐩掓祴璇曡揪鎴?00%鐨勫垎鏀鐩?涔熶笉鑳界綉緗楀埌鍥犱負鎺ュ彈淇″彿鑰屽彂鐢熺殑璺寵漿鍒嗘敮澶勭悊銆備篃灝辨槸璇村仛鍒?00%鐨勭綉緗椾俊鍙瘋煩杞垎鏀殑嫻嬭瘯鏄笉鑳藉叏閮ㄥ疄鐜扮殑銆備竴鑸殑錛屽姞涓婅鑰冭檻” 鍦ㄥ疄琛屾煇涓壒瀹氫唬鐮佹椂鍥犱負鎺ュ彈鍒頒俊鍙瘋屽彂鐢熺殑璇搷浣?#8221;榪欐牱鐨凚UG浼氱粡甯稿彂鐢?a title="id:yupo5656:20040703 銇畇igsafe銇浜嬨倰鍙傜収" >*2 鐨勮繖縐嶆儏鍐碉紝嫻嬭瘯鍥伴毦寰寰灝辨槸瀵艱嚧杞歡鐨勫搧璐ㄤ綆涓嬬殑璇卞洜銆?
鏍規(guī)嵁緇忛獙錛?#8221;褰撴鏌ュ埌瀛愯繘紼嬬粨鏉?鎺ユ敹鍒癝IGCHLD淇″彿)鏃訛紝瑕佸仛蹇呰鐨勫鐞?#8221;鍍忚繖鏍風殑淇″彿澶勭悊涓嶇鍋氫粈涔堥兘鏄湁蹇呰鐨勬儏鍐典細鏈夛紝浣嗘槸闄ゆ浠ュ鐨勪俊鍙峰鐞嗭紝渚嬪
鎶婅嚜宸辯殑鐘舵佺敤淇″彿鍛婅瘔鍏朵粬榪涚▼
涓葷嚎紼嬪湪杈撳叆杈撳嚭鍑芥暟閲屽彂閫佷俊鍙風粰琚樆濉炵殑瀛愮嚎紼嬶紝騫惰В闄ら樆濉?
絳夛紝鏄簲璇ヤ簨鍏堝ソ濂藉ソ濂借冭檻榪囧悗鍐嶅幓鍋氬疄闄呯殑瀹炵幇銆傚墠鑰呯殑璇濓紝濡傛灉涓嶅己鍒跺湪”鏅氱殑”榪涚▼闂磋繘琛岄氫俊鐨勮瘽鍙兘浼氬緢濂斤紝鍚庤呮槸鐗規(guī)剰瑕佷嬌鐢ㄧ嚎紼嬶紝涔熻搴旇鎸夌収鍗充嬌闃誨浜嗕篃涓嶈兘鍙戠敓闂閭f牱鍐嶈璁°?/p>
涓嶇鎬庝箞鏍鳳紝濡傛灉蹇呴』瑕佷嬌鐢ㄤ俊鍙風殑璇濓紝涔熻鍏堝叏閮?a title="銇ㄣ倞銇傘亪銇氥岄墑鍓囷紥銆嶃倰 :-) " >*3 鐞嗚В榪欎簺闄烽槺浠ュ強錛屽拰澶氱嚎紼嬭蔣浠惰璁$殑鍦哄悎涓鏍鋒垨鑰呰姣斿畠鏇翠弗鏍肩殑鍒剁害.娉ㄦ剰浜嬮」閮介渶瑕侀摥璁板湪蹇冮噷銆?/p>
*1 錛氫緥濡傦紝寮曠敤絀烘寚閽?/p>
*2 錛氬弬鐓?id:yupo5656:20040703 鐨剆igsafe璇存槑
*3 錛氭殏鏃跺厛鎺屾彙”鍑嗗垯2”:-)
]]> 鍑嗗垯2錛氳鐭ラ亾淇″彿澶勭悊鍑芥暟涓彲浠ュ仛閭d簺澶勭悊 http://www.shnenglu.com/lymons/archive/2008/06/01/51837.htmllymons lymons Sun, 01 Jun 2008 12:22:00 GMT http://www.shnenglu.com/lymons/archive/2008/06/01/51837.html http://www.shnenglu.com/lymons/comments/51837.html http://www.shnenglu.com/lymons/archive/2008/06/01/51837.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/51837.html http://www.shnenglu.com/lymons/services/trackbacks/51837.html
From 2008綺鵑?/a>
UNIX 涓?/span> C++紼嬪簭 璁捐瀹堝垯 (2) 鍘熸枃鍦板潃錛?/span> http://d.hatena.ne.jp/yupo5656/20040712/p2
鍑嗗垯 2: 瑕佺煡閬撲俊鍙峰鐞嗗嚱鏁頒腑鍙互鍋氶偅浜涘鐞?/span> · 鍦ㄧ敤 sigaction 鍑芥暟鐧昏鐨勪俊鍙峰鐞嗗嚱鏁頒腑鍙互鍋氱殑澶勭悊鏄涓ユ牸闄愬畾鐨?/span> · 浠呬粎鍏佽鍋氫笅闈㈢殑涓夌澶勭悊 1. 灞閮ㄥ彉閲忕殑鐩稿叧澶勭悊 2. “volatile sig_atomic_t” 綾誨瀷鐨勫叏灞鍙橀噺鐨勭浉鍏蟲搷浣?/span> 3. 璋冪敤寮傛淇″彿瀹夊叏鐨勭浉鍏沖嚱鏁?/span> · 浠ュ鐨勫叾浠栧鐞嗕笉瑕佸仛 錛?/span>
璇存槑 錛?/span> 鍥犱負鍦ㄦ敹鍒頒俊鍙鋒椂瑕佸仛涓浜涘鐞嗭紝閭i氬父鏄噯澶囦竴涓俊鍙峰鐞嗗嚱鏁板茍鐢?/span>sigaction 鍑芥暟鎶婂畠鍜屼俊鍙峰悕榪涜鍏寵仈鐨勮瘽灝?/span>OK 浜嗐備絾鏄紝鍦ㄨ繖涓俊鍙峰鐞嗗嚱鏁伴噷鍙互鍋氱殑澶勭悊鏄儚涓婇潰閭f牱琚弗鏍奸檺瀹氱殑銆傛病鏈夊緢濂芥帉鎻¤繖浜涚煡璇嗗氨闅忎究鍐欎竴浜涗唬鐮佺殑璇濆氨浼氬紩璧蜂笅闈㈤偅鏍風殑闂 錛?/span>· 闂 1: 鏈夌▼搴忔閿佺殑鍗遍櫓 o 榪欐槸閭d簺渚濊禆浜庢煇涓鏃跺埢錛岃屼笖閿欒鍐嶇幇姣旇緝鍥伴毦鐨?/span>BUG 浜х敓鐨勭湡姝e師鍥?/span> o 姝婚攣鏄竴涓瘮杈冨吀鍨嬬殑渚嬪瓙錛岄櫎姝や箣澶栬繕鑳藉紩璧峰嚱鏁拌繑鍥炲間笉姝g‘錛屼互鍙婂湪鏌愪竴鍑芥暟鍐呮墽琛屾椂紿佺劧鏀跺埌 SEGV 淇″彿絳夌殑璇搷浣溿?/span> 鈼?/em> 璇戣呮敞 1 錛?/span>SEGV 閫氬父 鍙?/span>鐢熷湪 榪?/span>紼?/span>璇曞浘璁塊棶 鏃犳晥鍐呭瓨鍖哄煙 鏃?/span>錛堝彲鑳芥槸涓?/span>NULL 鎸?/span>閽?/span>錛屾垨瓚呭嚭 榪?/span>紼嬬┖ 闂?/span>涔嬪鐨勫唴瀛樺湴鍧錛夈傚綋 bug 鍘熷洜鍜?/span>SEGV 褰卞搷鍦ㄤ笉鍚?/span>鏃墮棿 鍛?/span>鐜版椂 錛屽畠 浠?/span>鐗?/span>鍒毦 浜庢崟 鑾?/span>鍒般?/span>
· 闂 2: 鐢變簬緙栬瘧鍣ㄦ棤鎰忚瘑鐨勪紭鍖栨搷浣滐紝鏈夊鑷寸▼搴忕磰涔辯殑鍗遍櫓 o 榪欐槸璺熺紪璇戝櫒浠ュ強緙栬瘧鍣ㄤ紭鍖栫駭鍒湁鍏崇郴鐨?/span>bug 銆傚畠涔熸槸“緙栬瘧鍣ㄥ仛浜嗕紭鍖栧鐞嗚屼笉鑳芥甯稿姩浣?#8221;錛?#8220;鍥犱負 inline 鍖栦簡紼嬪簭涓嶈兘鍔ㄤ綔浜?#8221;錛?#8220;鍙樻崲浜?/span>OS 浜嗙▼搴忎篃涓嶈兘鍔ㄤ綔”絳夎繖浜涜В鏋愬洶闅?/span>bug 浜х敓鐨勫師鍥犮?/span>
榪樻槸涓杈圭湅鍏蜂綋鐨勪唬鐮佷竴杈硅В璇村惂銆傚湪涓嬮潰鐨勪唬鐮侀噷鑷沖皯鏈変笁涓棶棰橈紝鏍規(guī)嵁鐜鐨勪笉鍚屽緢鍙兘寮曡搗涓嶆紜殑鍔ㄤ綔 *1 銆?/span>鎸夌収嬈″簭鏉ヨ鏄庨噷闈㈢殑閿欒 銆?/span>
1 int gSignaled; 2 void sig_handler( int signo) { 3 std::printf(" signal %d received!\n " , signo); 4 gSignaled = 1 ; 5 } 6 int main( void ) { 7 struct sigaction sa; 8 銆銆// (鐪佺暐) 9 銆銆sigaction(SIGINT, & sa, 0 ); 10 gSignaled = 0 ; 11 while ( ! gSignaled) { 12 銆銆// std::printf("waiting \n"); 13 struct timespec t = { 1 , 0 } ; nanosleep( & t, 0 ); 14 }15 }16
閿欒 1: 绔炰簤鏉′歡 鍦ㄤ笂闈㈢殑浠g爜閲屾湁绔炰簤鏉′歡 銆?/span>鍦?/span>sigaction 鍑芥暟琚皟鐢ㄥ悗 銆?/span>鍦?/span>gSignaled 榪樻湭琚祴鍊兼垚 0 鍊間箣鍓嶏紝濡傛灉鎺ュ彈鍒?/span>SIGINT 淇″彿浜嗛偅浼氬彉寰楁庝箞鏍峰憿 ? 鍦ㄤ俊鍙峰鐞嗗嚱鏁頒腑琚鍐欐垚 1 鍚庣殑 gSignaled 浼氬湪淇″彿澶勭悊鍑芥暟榪斿洖鍚庤鍒濆鍖栨垚 0 銆?/span>鍦ㄥ悗闈㈢殑 while 寰幆閲屽彲鑳戒細鍙樻垚姝誨驚鐜?/span>銆?/span>
閿欒 2: 鍏ㄥ眬鍙橀噺 gSignaled 澹版槑鐨勭被鍨嬩笉姝g‘ 鍦ㄤ俊鍙峰鐞嗗嚱鏁伴噷浣跨敤鐨勫叏灞鍙樻暟 gSignaled 鐨勭被鍨嬫病鏈夊0鏄庢垚 volatile sig_atomic_t 銆?/span>榪欐牱鐨勮瘽 銆?/span>鍦ㄦ墽琛?/span>while 寰幆閲岀殑浠g爜鐨勬椂鍊欐帴鏀跺埌浜嗕簡 SIGINT 淇″彿鏃?/span>銆?/span>鏈夊彲鑳藉紩璧?/span>while 鐨勬寰幆 銆?/span>閭d負浠涔堣兘寮曡搗榪欐牱鐨勬儏鍐靛憿 錛?span> · 淇″彿澶勭悊鍑芥暟閲岋紝鎶婂唴瀛樹笂 gSignaled 鐨勫煎彉鏇存垚 1 錛屽畠鐨勬眹緙栦唬鐮佸涓嬶細
movl $1, gSignaled
· 浣嗘槸錛屽氨鍍忎笅闈㈢殑浠g爜鎻忚堪鐨勯偅鏍鳳紝 main 鍑芥暟鏄妸 gSignaled 鐨勫煎瓨鏀懼埌浜嗗瘎瀛樺櫒閲?/span>銆?/span>鍦?/span>w hile 寰幆涔嬪墠錛屼粎浠呮槸鍋氫簡涓嬈℃嫹璐濆彉閲?/span>gSignaled 鍐呭瓨涓婄殑鍊煎埌瀵勫瓨鍣ㄩ噷 銆?/span>鑰屽湪 while 寰幆閲屽彧鏄弬鐓ц繖涓瘎瀛樺櫒閲岀殑鍊?/span>銆?/span>
movl gSignaled, %ebx .L8: testl %ebx, %ebx jne .L8
鍦ㄤ笉鎵ц浼樺寲鐨勬儏鍐典笅緙栬瘧鍚庣紪璇戝櫒鏈夊彲鑳戒笉浼氱敓鎴愪笂闈㈤偅鏍風殑浼唬鐮?/span>銆?/span>浣?/span>Gcc 褰撲嬌鐢?/span>-O2 閫夐」鍋氫紭鍖栫紪璇戞椂錛岀敓鎴愮殑瀹為檯閭f牱鐨勬眹緙栦唬鐮佷駭鐢熺殑鍗卞騫朵笉浠呬粎鏄儚涓婇潰璇寸殑濞佽儊閭f牱綆鍗曘傝繖鏂歸潰鐨勯棶棰橈紝鏄澶囬┍鍔ㄧ殑寮鍙戣呮墍瑕佺煡閬撶殑甯歌瘑錛屼絾鐜板疄鎯呭喌鏄浜庡簲鐢ㄧ▼搴忕殑璁捐鑰?/span>. 寮鍙戣呭嚑涔庨兘涓嶇煡閬撹繖浜涚煡璇嗐?/span>涓轟簡瑙e喅涓婇潰鐨勯棶棰橈紝鍏ㄥ眬鍙橀噺 gSignaled 鐨勭被鍨嬭鍍忎笅闈㈤偅鏍峰0鏄?/span>銆?/span>
volatile sig_atomic_t gSignaled;
volatile 鍒欐槸鎻愮ず緙栬瘧鍣ㄤ笉瑕佸儚涓婇潰閭f牱鍋氫紭鍖栧鐞嗭紝鍙樻垚姣忔寰幆閮借鍙傜収璇ュ彉閲忓唴瀛橀噷鐨勫奸偅鏍瘋繘琛岀紪璇戙傛墍浠ュ湪淇″彿澶勭悊鍑芥暟閲屾妸璇ュ彉閲忕殑鍊間慨鏀瑰悗涔熻兘鐪熷疄鍙嶆槧鍒?/span>main 鍑芥暟鐨?/span>while 寰幆閲?/span>銆?/span>sig_atomic_t 鏄牴鎹?/span>CPU 綾誨瀷浣跨敤 typedef 鏉ラ傚綋瀹氫箟鐨勬暣鏁板鹼紝渚嬪 x86 騫沖彴鏄?/span>int 綾?/span>鍨?/span>銆?/span>灝辨槸鎸?/span>” 鐢ㄤ竴鏉℃満鍣ㄦ寚浠ゆ潵鏇存柊鍐呭瓨閲岀殑鏈澶?a target=_blank name=20040712fn2>鏁版嵁 鐨?/span>( 鍙傜収璇戣呮敞 2) 銆?/span>鍙﹀錛?/span> sig_atomic_t 綾誨瀷鐨勫彉閲忕殑鍙栧艱寖鍥存槸鍦?/span>SIG_ATOMIC_MIN/MAX 涔嬮棿 ( 鍙傝 §7.18.3/2) 銆?/span>鏈夋棤絎﹀彿鏄窡鍏蜂綋鐨勫疄鐜版湁鍏熾傝冭檻鍒扮Щ妞嶆у彇鍊煎湪 0 锝?span>127 涔嬮棿鏄瘮杈冨悎閫傜殑 銆?span>C99 涔熸敮鎸佽繖涓彇鍊艱寖鍥?/span>銆?/span>C++ 瑙勮寖 (14882:2003) 閲屼篃鏈夊悓鏍風殑鎻忚堪 銆?/span>紜垏鐨勪綅緗槸 §1.9/9 榪欓噷 銆?/span>鍦?/span>SUSv3 鐨勭浉鍏蟲弿榪拌鍙傝?/span>sigaction 榪欓噷 *3 銆?/span>姝ゅ 銆?/span>铏界劧鍦?/span>GCC 鐨勫弬鑰冩墜鍐岄噷涔?/span>璇翠簡 鎶婃寚閽堢被鍨嬫洿鏂版垚鍘熷瓙鎿嶄綔錛屼絾鍦ㄦ爣鍑?/span>C/C++ 鍗存病鏈夎杞?/span>*5 銆?/span>浣犱竴瀹氫細鎯婅浜庤繖涓〃閲岀殑鍑芥暟灝戝惂銆?/span>鍙﹀錛屼竴瀹氫笉瑕佸繕璁頒互涓嬬殑鍑犵偣錛?/span> · 铏界劧鍦?/span>SUSv3 閲屾湁寮傛淇″彿瀹夊叏 ( async-signal-safe ) 鍑芥暟鐨勪竴瑙堬紝浣嗘牴鎹笉鍚岀殑鎿嶄綔緋葷粺錛屾煇浜涘嚱鏁版槸娌℃湁琚疄鐜扮殑銆傛墍浠ヤ竴瀹氳鍙傝冩搷浣滅郴緇熺殑鎵嬪唽 · 絎笁鑰呭仛鎴愮殑鍑芥暟錛屽鏋滄病鏈夌壒鍒鏄庣殑鍦哄悎錛岄鍏堣鍋囧畾榪欎釜鍑芥暟鏄笉鍙噸鍏ュ嚱鏁幫紝涓嶈兘闅忎究鍦ㄤ俊 鍙峰鐞嗗嚱鏁頒腑浣跨敤銆?/span> · 璋冪敤涓嶅彲閲嶅叆鍑芥暟鐨勯偅浜涘嚱鏁板氨浼氬彉鎴愪笉鍙噸鍏ュ嚱鏁頒簡
鏈鍚庯紝涓轟簡鏄庣‘璧瘋錛屾兂璇存槑涓涓嬩粈涔堟槸 ” 寮傛淇″彿瀹夊叏 ( async-signal-safe )” 鍑芥暟 銆?/span>寮傛淇″彿瀹夊叏鍑芥暟鏄寚 ” 鍦ㄨ鍑芥暟鍐呴儴鍗充嬌鍥犱負淇″彿鑰屾鍦ㄨ涓柇錛屽湪鍏朵粬鐨勫湴鏂硅鍑芥暟鍐嶈璋冪敤浜嗕篃娌℃湁浠諱綍闂 ” 銆傚鏋滃嚱鏁頒腑瀛樺湪鏇存柊闈欐佸尯鍩熼噷鐨勬暟鎹殑鎯呭喌 ( 渚嬪錛?/span>malloc) 錛屼竴鑸儏鍐典笅閮芥槸涓嶅叏鐨勫紓姝ヤ俊鍙峰嚱鏁般備絾鏄紝鍗充嬌浣跨敤闈欐佹暟鎹紝濡傛灉鍦ㄨ繖閲岃繖涓暟鎹椂鍊欐妸淇″彿灞忚斀浜嗙殑璇濓紝瀹冨氨浼氬彉鎴愬紓姝ヤ俊鍙峰畨鍏ㄥ嚱鏁頒簡銆?/span>鈼?/span>璇戣呮敞 3 錛氫笉鍙噸鍏ュ嚱鏁板氨涓嶆槸寮傛淇″彿瀹夊叏鍑芥暟
*1 錛?span>sigaction
鍑芥暟琚皟鐢ㄥ墠錛屼竴鎺ユ敹鍒?/span>SIGINT 淇″彿灝辯粓姝㈢▼搴忥紝鏆備笖闄ゅ鍚?/span>*2 錛?/span>“鏈澶?#8221;鏄笉瀹屽叏姝g‘鐨?/span>銆?/span>渚嬪錛?/span>Alpha 騫沖彴涓?/span>32/64bit 鐨勫彉閲忕敤涓鏉″懡浠や篃鑳借鏇存柊錛屼絾鏄ソ鍍忔妸 8/16bit 鐨勬暟鎹洿鏂扮紪紼嬩簡澶氭潯鍛戒護浜?/span>銆?/span>http://lists.sourceforge.jp/mailman/archives/anthy-dev/2005-September/002336.html 璇峰弬鑰冭繖涓?/span>URL 鍦板潃 銆?/span> *3 錛?/font>If the signal occurs other than as the result of calling abort(), kill(), or raise(), the behavior is undefined if the signal handler calls any function in the standard library other than one of the functions listed in the table above or refers to any object with static storage duration other than by assigning a value to a static storage duration variable of type volatile sig_atomic_t. Furthermore, if such a call fails, the value of errno is unspecified. *4 錛?/span>鍦ㄨ繖涓墜鍐岄噷“ In practice, you can assume that int and other integer types no longer than int are atomic. ”榪欓儴鍒嗘槸涓嶆紜殑 銆?/span>璇峰弬鐓?/span>Alpha 鐨勪緥瀛?/span> *5 錛?span>The following table defines a set of functions that shall be either reentrant or non-interruptible by signals and shall be async-signal-safe. 鍚庨潰 鏈夊紓姝ヤ俊鍙峰畨鍏ㄥ嚱鏁頒竴瑙?/span>
]]> 鍑嗗垯3錛氬綰跨▼紼嬪簭閲屼笉鍑嗕嬌鐢╢ork http://www.shnenglu.com/lymons/archive/2008/06/01/51836.htmllymons lymons Sun, 01 Jun 2008 12:16:00 GMT http://www.shnenglu.com/lymons/archive/2008/06/01/51836.html http://www.shnenglu.com/lymons/comments/51836.html http://www.shnenglu.com/lymons/archive/2008/06/01/51836.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/51836.html http://www.shnenglu.com/lymons/services/trackbacks/51836.html 闃呰鍏ㄦ枃 ]]> 鍦▁ml閲岃拷鍔犵粨鐐規(guī)椂娣誨姞鍥炶濺(libxml2) http://www.shnenglu.com/lymons/archive/2007/11/30/37553.htmllymons lymons Fri, 30 Nov 2007 05:44:00 GMT http://www.shnenglu.com/lymons/archive/2007/11/30/37553.html http://www.shnenglu.com/lymons/comments/37553.html http://www.shnenglu.com/lymons/archive/2007/11/30/37553.html#Feedback 4 http://www.shnenglu.com/lymons/comments/commentRss/37553.html http://www.shnenglu.com/lymons/services/trackbacks/37553.html 涓嶈繃鍦ㄦ祴璇曟椂鎴戜滑鍙戠幇鐢ㄦ枃绔犻噷F. 娣誨姞灞炴т緥紼嬩唬鐮?鏃訛紝娣誨姞鐨刱eyword緇撶偣鍚庨潰娌℃湁鍥炶濺錛? 璺熷悗闈㈢殑緇撶偣鎸ゅ湪涓琛屼簡錛屼笉鏄緢濂界湅銆? 渚嬪錛屼互涓嬬殑xml渚嬪瓙鏂囦歡 闃呰鍏ㄦ枃 ]]> 緇欐枃浠墮攣璁懼畾timeout http://www.shnenglu.com/lymons/archive/2007/11/26/37318.htmllymons lymons Mon, 26 Nov 2007 06:52:00 GMT http://www.shnenglu.com/lymons/archive/2007/11/26/37318.html http://www.shnenglu.com/lymons/comments/37318.html http://www.shnenglu.com/lymons/archive/2007/11/26/37318.html#Feedback 0 http://www.shnenglu.com/lymons/comments/commentRss/37318.html http://www.shnenglu.com/lymons/services/trackbacks/37318.html
From 2008綺鵑?/a>
Linux 鏂囦歡閿佹槸寤鴻閿侊紝涔熸湁浜烘妸瀹冨彨鍋氳褰曢攣錛屾槸閫氳繃緋葷粺璋冪敤fcntl(2)鏉ュ疄鐜扮殑銆?br>榪欑閿佸湪閿佸畾鏂囦歡鏃舵湁涓ょ妯″紡錛屽垎鍒槸闃誨(block)鍜岄潪闃誨妯″紡銆?br>鍦ㄧ紪鐮佹椂姣旇緝甯哥敤鐨勬槸鏈変竴縐嶇殑闈為樆濉炴ā寮忥紝涔熷氨鏄彂鐜版枃浠跺凡緇忚鍏朵粬榪涚▼ 閿佸畾鏃訛紝绔嬪嵆榪斿洖涓嶄簣絳夊緟銆傝岄樆濉炴ā寮忓垯姝eソ涓庡畠鐩稿弽錛屼篃灝辨槸涓鐩寸瓑寰呯洿鍒?br>鍏朵粬榪涚▼閲婃斁鏂囦歡閿佷負姝€?br>娉細鍏充簬璇︾粏鍐呭璇峰弬鐪嬨奤nix鐜楂樼駭緙栫▼銆?/span> 涓嶈繃錛屾湁鐨勬椂鍊欎篃浼氱敤鍒伴樆濉炴ā寮忕殑鏂囦歡閿侊紝鑰屼笖浼氳姹備笉鑳借涓鐩撮樆濉烇紝絳夊緟 浜嗕竴瀹氭椂闂村悗搴旇繑鍥炪備篃灝辨槸璇達紝鎯崇鄲闃誨鐗堟湰鐨勬枃浠墮攣鍔犱笂涓涓秴鏃舵椂闂?timeout)銆?br> 閫氳繃man鎵嬪唽錛宖cntl(2)閲岄潰娌℃湁鍏充簬鍦ㄩ樆濉炴ā寮忔椂錛岃緗秴鏃舵椂闂寸殑浠諱綍鎻忚堪銆?br>浣嗕粠man鎵嬪唽閲屾垜浠彂鐜幫紝鏂囦歡閿佸湪闃誨鏃朵細琚俊鍙?signal)涓柇銆傛墍浠ユ垜浠氨鍍?br>鍙互鍒╃敤璁劇疆淇″彿杞腑鏂潵瀹炵幇涓涓嚜宸辯増鏈殑絳夊緟瓚呮椂鍛€?br>
1 #include < stdio.h > 2 #include < stdlib.h > 3 #include < unistd.h > 4 #include < fcntl.h > 5 #include < sys / types.h > 6 #include < sys / stat.h > 7 #include < signal.h > 8 9 #define readw_lock(fd) \ 10 lock_reg((fd), F_SETLKW, F_RDLCK) 11 #define writew_lock(fd) \ 12 lock_reg((fd), F_SETLKW, F_WRLCK) 13 #define unlock(fd) \ 14 lock_reg((fd), F_SETLK, F_UNLCK) 15 16 typedef int ( * LW_FN)( char * fname); 17 18 int 19 lock_reg( int fd, int cmd, int type) 20 { 21 struct flock lock ; 22 lock .l_type = type; 23 lock .l_start = 0 ; 24 lock .l_whence = SEEK_SET; 25 lock .l_len = 0 ; 26 27 return fcntl(fd, cmd, & lock ); 28 } 29 30 void hander( int signo) 31 { 32 // do nothing 33 return ; 34 } 35 36 int lockw( char * fname, LW_FN fn, int timeout) 37 { 38 int ret = 0 ; 39 int fd; 40 struct sigaction act, oact; 41 42 if ((fd = open(fname, O_CREAT | O_RDWR, 0666 )) == - 1 ) { 43 printf( " open failed!\n " ); 44 return - 1 ; 45 } 46 47 // set timer to wakeup fcntl 48 act.sa_handler = hander; 49 sigemptyset( & act.sa_mask); 50 act.sa_flags = 0 ; // here, must be zero for wakeup fcntl 51 sigaction(SIGALRM, & act, & oact); 52 53 int sec = alarm(timeout); 54 55 if (writew_lock(fd) == 0 ) { 56 alarm(sec); 57 // recovery signal handler. 58 sigaction(SIGALRM, & oact, NULL); 59 60 printf(" locked OK!\n " ); 61 62 // here, add code about file. 63 #ifdef _TEST 64 getchar(); 65 ret = 0 ; 66 #else 67 ret = fn(fname); 68 #endif 69 70 printf( " unlocked!\n " ); 71 unlock(fd); 72 } 73 else { 74 alarm(sec); 75 // recovery signal handler. 76 sigaction(SIGALRM, & oact, NULL); 77 // lock failed, because of timeout. 78 printf( " write lock failed\n " ); 79 ret = - 1 ; 80 } 81 82 return ret; 83 } 84 85 // test code 86 int func( char * fname) 87 { 88 printf( " check file:%s \n " , fname); 89 getchar(); 90 return 0 ; 91 } 92 93 int main() 94 { 95 return lockw( " file.lock " , func, 5 ); 96 } 97 98
璇ョ▼搴忕殑鍘熺悊鏄紝鍒╃敤浜哸larm(2)璁劇疆鐨勫畾鏃跺櫒錛屽湪涓瀹氭椂闂磋繃鍚庝細浜х敓SIGALRM淇″彿錛屼細浣垮綋鍓嶆鍦?br>鎵ц鐨勭郴緇熻皟鐢ㄤ腑鏂紝瀵艱嚧璇ョ郴緇熻皟鐢?fcntl)榪斿洖澶辮觸銆?/span>
涓婅堪浠g爜鏈変互涓嬬殑璇存槑錛?br> 1. 淇″彿澶勭悊鍑芥暟hander鏄竴涓┖鍑芥暟錛岄噷闈粈涔堜篃涓嶅仛銆傚畠鐨勫瓨鍦ㄥ氨鏄負浜嗘帴鏀?strong>SIGALRM淇″彿 2. sigaction 鐨?strong>sa_flags 鎴愬憳涓瀹氳璁劇疆鎴?錛屽惁鍒欎笉浼氭槸緋葷粺璋冪敤涓柇 3. 涓轟簡闃叉鎶婁互鍓嶈緗殑瀹氭椂鍣ㄧ牬鍧忥紝涓嶇鏄姞閿佹垚鍔熻繕鏄け璐ラ兘绔嬪嵆鎭㈠浠ュ墠鐨勫畾鏃跺櫒銆?br> 4. 鍥犱負涓轟簡鎺ユ敹SIGALRM 淇″彿錛屾垜浠緗簡瀹冪殑淇″彿澶勭悊鍑芥暟銆傞偅鍦ㄥ姞閿佸け璐ュ拰鎴愬姛鍚庝篃瑕佹仮澶嶄互鍓嶇殑璁懼畾銆?br> 娉細铏界劧涓婇潰鐨勪唬鐮佽兘瀹炵幇鏂囦歡閿佽秴鏃剁瓑寰呯殑闂錛屼絾鍙堝紩鍏ヤ簡鍙︿竴涓棶棰橈紝灝辨槸璇ヤ唬鐮佷細鐮村潖浠ュ墠璁懼畾鐨勫畾鏃跺櫒錛屽嵆浣挎槸鍚庨潰涔熸仮澶嶄簡浠ュ墠鐨勫畾鏃跺櫒璁劇疆錛屼篃浼氭湁涓浜涘壇浣滅敤銆傛瘮濡傦細褰撲負浜嗙瓑寰呭叾浠栬繘紼嬮噴鏀炬枃浠墮攣錛屼紶閫掑埌l(fā)ockw鍑芥暟閲岀殑絳夊緟鏃墮棿(涔熷氨鏄艦鍙倀imeout)瓚呰繃浜嗕互鍓嶈瀹氱殑瀹氭椂鍣ㄨЕ鍙戞椂闂達紝閭h繖孌墊湡闂村唴鐨勪互鍓嶈瀹氱殑瀹氭椂鍣ㄥ氨鏃犳晥浜嗐備篃灝辨槸璇? 鍦ㄨ皟鐢╨ockw涔嬪墠,璇ヨ繘紼嬩簡宸茬粡璁懼畾浜嗕竴涓?縐掔殑瀹氭椂鍣? 鑰岃繖涓繘紼嬪湪璋冪敤lockw鏃朵紶閫掔殑timeout鏃墮棿涓?0縐?閿佸畾鐨勯樆濉炴椂闂翠負10縐?, 閭d箞浠庤皟鐢╨ockw鐨勯偅涓鍒昏搗,2縐掔殑瀹氭椂鍣ㄥ氨鏃犳晥浜?鐭ラ亾閿佸畾鎴愬姛鎴栬呭け璐ヤ負姝?
]]> 青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
一区二区三区www |
日韩亚洲国产精品 |
久久精品官网 |
欧美一区二区播放 |
国产综合香蕉五月婷在线 |
久久久久99 |
久久精品日韩欧美 |
亚洲黄色在线 |
亚洲精品影院 |
国产精品永久免费 |
鲁大师成人一区二区三区
|
亚洲伊人伊色伊影伊综合网 |
999在线观看精品免费不卡网站 |
欧美吻胸吃奶大尺度电影 |
午夜视频一区 |
久久久久久婷 |
亚洲视频中文 |
久久精品视频播放 |
国产精品99久久久久久久vr |
亚洲欧美视频一区二区三区 |
亚洲国产三级 |
这里只有精品丝袜 |
影音先锋另类 |
亚洲视频精选在线 |
亚洲国产精品激情在线观看 |
99精品视频一区二区三区 |
国产亚洲精品资源在线26u |
欧美高清在线观看 |
国产乱码精品一区二区三区不卡 |
欧美aⅴ一区二区三区视频 |
欧美日韩三级 |
嫩模写真一区二区三区三州 |
欧美色视频一区 |
欧美成人免费网 |
国产日韩欧美91 |
亚洲精品在线免费 |
在线免费观看日本欧美 |
亚洲天堂久久 |
一本久久a久久精品亚洲 |
久久av一区 |
性久久久久久久久 |
欧美精品少妇一区二区三区 |
久久综合色一综合色88 |
国产精品蜜臀在线观看 |
最新日韩在线视频 |
亚洲欧美在线另类 |
夜夜嗨av一区二区三区网站四季av |
欧美一区免费视频 |
午夜精品福利电影 |
欧美香蕉视频 |
亚洲人体1000 |
亚洲美女一区 |
欧美va天堂 |
农村妇女精品 |
国外成人免费视频 |
欧美伊人久久久久久久久影院 |
这里只有精品在线播放 |
欧美激情第9页 |
亚洲电影免费在线观看 |
又紧又大又爽精品一区二区 |
欧美与黑人午夜性猛交久久久 |
西西人体一区二区 |
国产精品jizz在线观看美国 |
亚洲精品中文字幕女同 |
夜夜嗨av一区二区三区免费区 |
美女在线一区二区 |
欧美国产精品专区 |
亚洲人成亚洲人成在线观看 |
免费观看在线综合色 |
欧美大片免费久久精品三p |
亚洲国产91 |
欧美成人免费全部 |
亚洲日本欧美 |
亚洲图片欧美日产 |
国产精品久久久亚洲一区
|
亚洲国产精品第一区二区 |
亚洲黄色视屏 |
欧美精品日本 |
99精品国产99久久久久久福利 |
日韩午夜高潮 |
国产精品久久久久久超碰 |
亚洲欧美清纯在线制服 |
久久精品国产清自在天天线 |
国内精品免费在线观看 |
久久午夜羞羞影院免费观看 |
欧美α欧美αv大片 |
在线欧美一区 |
欧美日韩在线播放一区 |
亚洲欧美日韩国产综合精品二区 |
久久久精品国产免大香伊 |
在线观看中文字幕亚洲 |
欧美日韩精品福利 |
午夜精品影院 |
久久精品国产一区二区三区免费看
|
最近中文字幕日韩精品
|
亚洲欧洲一区二区三区在线观看 |
欧美激情一区二区三区在线
|
免费成人av资源网 |
一本色道久久综合狠狠躁的推荐 |
国产精品久久毛片a |
久久夜色精品国产噜噜av |
亚洲国产综合91精品麻豆 |
午夜精品福利一区二区蜜股av |
红桃视频亚洲 |
欧美丝袜第一区 |
欧美一区二区福利在线 |
亚洲激情午夜 |
影音先锋亚洲精品 |
国产精品二区三区四区 |
美脚丝袜一区二区三区在线观看
|
欧美jizzhd精品欧美喷水 |
亚洲一区二区三区精品视频 |
精品不卡视频 |
国产精品手机在线 |
麻豆成人在线观看 |
性欧美18~19sex高清播放 |
亚洲品质自拍 |
久久综合伊人 |
欧美一区影院 |
亚洲性av在线 |
亚洲人成亚洲人成在线观看 |
国产综合久久久久久 |
国产精品久久9 |
欧美另类一区二区三区 |
久久九九热re6这里有精品 |
亚洲校园激情 |
99re6这里只有精品视频在线观看 |
免费不卡中文字幕视频 |
久久久久一区二区三区 |
午夜精品久久 |
亚洲女同精品视频 |
亚洲天堂免费观看 |
日韩午夜在线观看视频 |
亚洲激情另类 |
亚洲黄色av |
亚洲激情在线播放 |
在线观看日产精品 |
精品91在线 |
一区视频在线 |
影音先锋久久 |
亚洲盗摄视频 |
在线日本高清免费不卡 |
在线日韩一区二区 |
在线视频国产日韩 |
亚洲国产天堂久久综合 |
亚洲第一精品电影 |
亚洲激情视频在线观看 |
亚洲欧洲视频 |
99ri日韩精品视频 |
一区二区三区黄色 |
亚洲永久精品国产 |
午夜精品久久久久久久白皮肤 |
亚洲永久免费av |
欧美一级夜夜爽 |
久久国产婷婷国产香蕉 |
久久久五月天 |
欧美福利一区二区三区 |
亚洲国产精品一区二区第一页 |
亚洲国产精品欧美一二99 |
亚洲精品乱码久久久久久蜜桃麻豆
|
亚洲欧美日韩国产成人 |
欧美一二区视频 |
裸体丰满少妇做受久久99精品
|
一区二区三区黄色 |
香蕉乱码成人久久天堂爱免费 |
久久爱91午夜羞羞 |
女生裸体视频一区二区三区 |
亚洲级视频在线观看免费1级 |
亚洲毛片在线观看 |
小嫩嫩精品导航 |
裸体一区二区 |
国产精品v欧美精品v日本精品动漫 |
国产精品免费在线 |
亚洲福利视频二区 |
亚洲视频每日更新 |
久久久天天操 |
99re6这里只有精品视频在线观看 |
亚洲综合欧美日韩 |
蜜臀av性久久久久蜜臀aⅴ |
欧美日韩国产限制 |
国产在线乱码一区二区三区 |
欧美午夜不卡在线观看免费
|
亚洲大胆人体视频 |
亚洲欧美日韩区 |
欧美a级理论片 |
99精品视频免费全部在线 |
久久久噜噜噜久久中文字免 |
欧美日韩精品三区 |
伊人久久婷婷色综合98网 |
一区二区三区精品久久久 |
久久免费偷拍视频 |
9人人澡人人爽人人精品 |
久久久www成人免费无遮挡大片
|
国产精品制服诱惑 |
一区二区日韩精品 |
久久这里只有 |
亚洲欧美日韩综合aⅴ视频 |
欧美人与禽猛交乱配 |
曰韩精品一区二区 |
欧美综合国产 |