青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

清風竹林

ぷ雪飄絳梅映殘紅
   ぷ花舞霜飛映蒼松
     ----- Do more,suffer less

Solmyr 的小品文系列之六:成對出現

“呼 ~~~~ 啪!”

一個文件夾劃出一道優美的弧線,越過四張桌子,兩堵隔墻,一條走道,不偏不倚的穿過了正在交談的路人甲和路人乙,精準的命中了目標。放眼公司上下,擁有這般投擲手法的,只有 Solmyr ,而他的目標,自然是 zero 了。

“哎喲!”,zero 摸了摸被擊中的后腦勺,一半不甘一半認命的嘆了一口氣:不用問,他一定又有什么把柄被 Solmyr 抓住了。

“這次我又犯了什么錯誤了?”,zero 匆匆中斷了與方圓五十米內唯一的女程序員 pisces 之間愉快的閑聊,來到 Solmyr 身邊看看究竟哪里出了不妥。

“你剛剛提交的代碼會導致線程死鎖”,Solmyr 指著 zero 提交的一個函數:

void some_func()
{
pthread_mutex_lock(&mtx);
……
……
pthread_mutex_unlock(&mtx);
}

“會嗎?我明明在函數末尾釋放了互斥變量的呀?”

Solmyr 看了看 zero ,那表情分明在說:朽木不可雕也。他順手標出了函數中間的兩行代碼:

void some_func()
{
pthread_mutex_lock(&mtx);
……
if( status == E_FAIL )
 return;
……
pthread_mutex_unlock(&mtx);
}

“Oops!”,zero 拍了一下腦門,“我知道了我知道了,我這就改。”

“你知道了?說說看你犯了什么錯誤?”

“我忘了在中間的函數返回點解鎖。”

“那你準備怎么解決這個問題”,很明顯,Solmyr 不打算就此輕輕放過 zero。

“嗯 …… 很簡單啊,在這里加上一行代碼,象這樣:”

if( status == E_FAIL )
{
pthread_mutex_unlock(mtx);
return;
}

Solmyr 搖搖頭:“你這是頭痛醫頭,腳痛醫腳。如果你這個函數里不只一個鎖,不只一個返回點,你打算怎么做?在每個返回點解開每個鎖么?”

“嗯 …… 你是指我應該遵循一個函數只有一個返回點的原則?”,zero 撓撓頭,有些不太確定。

“我不是指這個。有些情況下,硬要讓函數只有一個返回點會導致巨大的 if/else 結構,降低代碼的可讀性。而且,即使你的函數只有一個返回點,你還是有可能遇到這個問題。考慮這樣的函數:”,Solmyr 飛快的鍵入:

void some_func()
{
pthread_mutex_lock(&mtx);
……
// 中間沒有其他返回點
……
foo(); // 由其他程序員實現的函數
……
pthread_mutex_unlock(&mtx);
}

“看起來一點問題也沒有,可是如果 foo 這個函數丟出異常的話,會出現什么情況?”

“嗯 …… 如果我們函數里沒有捕獲這個異常的話 …… 它會導致 some_func 函數在調用 foo 的這一點中斷 …… 哎呀 ……”,zero 發現了問題所在。“那么只能在每個可能拋出異常的函數調用點用 try 捕獲所有異常,然后 ……”,zero 越說越小聲,“ …… 然后在 catch 里面解鎖,再重新拋出 ……” zero 停了下來,煩惱的撓著頭,發現他連自己都說服不了:這樣的解法實在是太繁瑣、太容易引入錯誤了。

“嗯?”

“好吧,我承認我不知道該怎么辦了,Solmyr ,這種情況應該怎么處理呢?”

“回憶一下,前兩天我們在飯桌上討論過什么?”(參見“Solmyr 的小品文系列”的前一期,“垃圾收集”)

“你是說垃圾收集嗎?哎 …… 可是 …… 那是處理內存泄漏的呀?和這個問題有什么關系?”

“我不是指具體的解法,”,Solmyr 搖搖頭,“關鍵是上次討論中引入的具有普遍性的原則,也就是 ……” Solmyr 停了下來,轉頭看著 zero 。

“…… ……”

“唉 ……”,Solmyr 用別人模仿不來的無奈表情 —— 按照他自己的說法,這是多年培訓工作的積累 —— 嘆了口氣:“我說 zero,你還很年輕,不會這么早就記憶力衰退了吧?”

…… 真是可惡的家伙,zero 心中恨恨的想。

Solmyr 的聲音再度在 zero 接近崩潰邊緣的時候響了起來:“如果你希望保證某些事情成對出現,請使用 ……”

“構造函數與析構函數!”,zero 生怕錯過了顯示自己并非“記憶力衰退”的機會。

“不用喊那么大聲。”,Solmyr 皺了皺眉,“你把前排觀眾都嚇壞了。”

“??。?!”,zero 迅速轉身,發現附近不知什么時候圍滿了公司的同事,每個人都“正常”在做自己的事情,只是動作稍顯忙亂而已 ……

解決了四周的“觀眾”之后,zero 回到了顯示器前,信心滿滿:“我知道了 Solmyr ,這里我們可以用和上次處理 分配/釋放 內存非常類似的手段來處理 加鎖/解鎖,只要寫一個非常簡單的類就行了,象這樣:”,zero 一邊說,一邊鍵入:

class auto_lock
{
public:
auto_lock(pthread_mutex_t mtx) : m_mtx(mtx)
{
 pthread_mutex_lock(&m_mtx); // 構造時加鎖
}
~auto_lock()
{
 pthread_mutex_unlock(&m_mtx); // 析構時解鎖
}

private:
pthread_mutex_t& m_mtx;
}

void some_func()
{
auto_lock(mtx);
……
// return 、foo ,隨便什么東西都行
……
// 結束的時候同樣不用解鎖
}

“這樣一來,我之前遇到的問題就全解決了,我可以自由的實現我的函數,不論什么時候返回或者遇到異常,我都可以肯定 mtx 將會被解鎖,不用擔心線程死鎖的問題。”

“嗯, 不錯。” Solmyr 贊許的點了點頭,開始總結:“實際上這是一個非常常用的手段,除了我們討論過的兩種情況而外,還可以應用在很多場合。比如網絡訪問中的建立連接和斷開連 接,數據庫訪問中的登錄與退出登錄,還可以方便的用它來實現測量一個函數平均運行耗時的測試工具,等等等等。不過萬變不離其宗,在這一切應用的背后是一個 統一的原則 ……”

Solmyr 頓了一頓,zero 心領神會的接了上去:

“如果你希望保證某些事情成對出現,請使用構造函數與析構函數。”

posted on 2009-08-19 11:17 李現民 閱讀(439) 評論(0)  編輯 收藏 引用 所屬分類: 絕對盜版

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美午夜寂寞影院| 亚洲综合国产| 亚洲你懂的在线视频| 99精品欧美一区二区三区综合在线 | 好男人免费精品视频| 国产欧美一区二区三区另类精品 | 国产精品久久久久久久久久ktv| 欧美日韩另类视频| 国产精品久久久久毛片软件 | 欧美成人亚洲成人| 欧美成人在线免费观看| 欧美日韩成人综合天天影院| 国产精品久久久久9999| 欧美激情1区| 一本色道久久综合亚洲精品婷婷 | 亚洲男同1069视频| 午夜视频一区二区| 老司机精品久久| 日韩一级欧洲| 欧美中文字幕在线观看| 欧美精品一区二区三区蜜臀| 国产精品国产精品| 在线观看亚洲专区| 夜夜狂射影院欧美极品| 久久久精品网| 一本色道久久88精品综合| 欧美一级大片在线观看| 欧美精品午夜| 在线看欧美日韩| 欧美一级一区| 91久久精品一区二区别| 亚洲性色视频| 欧美国产在线视频| 国产亚洲高清视频| 亚洲视频在线观看一区| 欧美aⅴ99久久黑人专区| 一区二区三欧美| 欧美大胆人体视频| 国外成人网址| 欧美影视一区| 国产精品99久久不卡二区| 牛牛影视久久网| 狠狠色狠狠色综合| 欧美一区二区三区免费观看| 最新成人在线| 久久综合精品一区| 国产一区二区三区在线观看网站| 在线视频精品| 亚洲国产日韩欧美在线图片| 久久久久久综合| 国内精品国产成人| 久久久精品视频成人| 午夜精品久久久久久久蜜桃app| 欧美日韩xxxxx| 91久久精品国产91久久| 久久人人97超碰国产公开结果| 亚洲综合首页| 国产精品一区二区三区观看| 亚洲主播在线观看| 一区二区欧美在线| 欧美性猛交一区二区三区精品| 一区二区免费在线观看| 亚洲精品在线免费| 欧美绝品在线观看成人午夜影视| 欧美精品少妇一区二区三区| 亚洲人成人77777线观看| 欧美成人激情在线| 免费的成人av| 亚洲欧美视频在线观看| 亚洲成色www8888| 亚洲人成毛片在线播放| 欧美高清hd18日本| 亚洲精品在线看| 亚洲黄色av| 欧美日韩一二区| 午夜在线成人av| 欧美一级免费视频| 亚洲成人在线视频播放| 亚洲国产精品久久久久秋霞不卡| 欧美不卡视频一区发布| aaa亚洲精品一二三区| 一区二区av在线| 国产原创一区二区| 亚洲激情第一区| 国产精品乱码久久久久久| 欧美一区二区在线观看| 久久av资源网| 日韩一级片网址| 亚洲一区二区视频| 亚洲成人影音| 亚洲美女在线视频| 国产婷婷一区二区| 亚洲福利av| 国产精品视频一二| 欧美大尺度在线| 国产精品嫩草久久久久| 欧美高清在线播放| 国产精品网站在线| 欧美激情中文字幕在线| 国产精品久久久久久久久搜平片| 狼狼综合久久久久综合网| 欧美色网一区二区| 欧美不卡高清| 国产日韩欧美另类| 亚洲精品国产精品国产自| 国产喷白浆一区二区三区| 亚洲第一中文字幕在线观看| 国产日韩高清一区二区三区在线| 亚洲激情第一页| 尤物九九久久国产精品的分类| 99re6这里只有精品| 影音先锋一区| 性欧美精品高清| 亚洲自拍电影| 欧美日韩在线看| 亚洲精品精选| 日韩亚洲成人av在线| 蜜桃av一区二区三区| 久久天堂国产精品| 国产视频欧美视频| 亚洲一区二区三区四区在线观看 | 欧美一级理论片| 欧美日本一区二区视频在线观看| 免费中文日韩| 伊人成人在线| 欧美专区福利在线| 久久噜噜噜精品国产亚洲综合| 国产日本欧美一区二区| 亚洲一区中文| 性久久久久久久久久久久| 欧美午夜久久久| 亚洲精品一二| 99热这里只有精品8| 亚洲美女精品久久| 美女黄网久久| 亚洲第一网站| 亚洲精品久久久久久一区二区| 久久这里只有| 欧美激情a∨在线视频播放| 在线看片欧美| 欧美成人tv| 99国内精品久久| 亚洲欧美日韩精品综合在线观看 | 美女精品一区| 欧美不卡视频一区| 亚洲精品婷婷| 欧美日韩午夜剧场| 亚洲综合视频1区| 久久亚洲精品中文字幕冲田杏梨| 影院欧美亚洲| 欧美连裤袜在线视频| 亚洲午夜三级在线| 久久激情综合| 亚洲国产三级| 欧美日韩直播| 欧美亚洲三区| 免费在线亚洲| 亚洲午夜免费视频| 国产一区二区三区的电影| 久久久久久久久久码影片| 欧美激情网友自拍| 亚洲午夜小视频| 国内精品久久久久影院色| 欧美mv日韩mv国产网站app| 一区二区三区高清在线| 久久天天躁狠狠躁夜夜av| 亚洲激情视频网站| 国产精品久久久久国产a级| 久久精品在线观看| 日韩午夜av| 久久综合综合久久综合| 亚洲一区二区三区国产| 在线日韩视频| 国产精品影片在线观看| 欧美/亚洲一区| 香蕉久久夜色| 亚洲精品日产精品乱码不卡| 欧美一区二区高清在线观看| 亚洲国产天堂久久国产91| 国产精品久久久亚洲一区| 久久午夜精品一区二区| 亚洲一区bb| 亚洲三级电影全部在线观看高清 | 正在播放亚洲一区| 免费成人小视频| 羞羞视频在线观看欧美| 亚洲伦理中文字幕| 激情婷婷亚洲| 国产日韩欧美成人| 国产精品户外野外| 欧美黄色一区二区| 久久影视三级福利片| 欧美一区二区三区在线看| 一区二区三区四区五区在线| 亚洲国产一区在线观看| 欧美国产日韩亚洲一区| 久久久久久91香蕉国产| 欧美一区二区三区另类| 性欧美videos另类喷潮| 亚洲欧美日本视频在线观看|