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

清風竹林

ぷ雪飄絳梅映殘紅
   ぷ花舞霜飛映蒼松
     ----- 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 李現民 閱讀(441) 評論(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>
            国产精品嫩草影院av蜜臀| 激情91久久| 午夜老司机精品| 一区二区欧美日韩视频| 国产精品久久久爽爽爽麻豆色哟哟| 这里只有精品丝袜| 一区二区三区成人| 国产欧美一区二区三区另类精品| 久久亚裔精品欧美| 欧美国产国产综合| 亚洲综合社区| 久久精品卡一| 日韩视频永久免费观看| 正在播放欧美一区| 激情久久五月天| 亚洲伦伦在线| 国产午夜亚洲精品理论片色戒| 免费观看国产成人| 欧美日韩一区二区在线视频| 欧美一区高清| 你懂的国产精品| 午夜在线精品| 久久久久久久一区二区| 一区二区三区国产精品| 欧美在线视频播放| 一本久道综合久久精品| 欧美在线在线| 亚洲色在线视频| 久久久综合激的五月天| 亚洲伊人第一页| 欧美成人中文字幕| 久久精品国产欧美激情| 欧美激情综合亚洲一二区 | 欧美护士18xxxxhd| 欧美一区二区三区电影在线观看| 久热精品在线视频| 久久精品国产96久久久香蕉| 欧美激情一区二区三区在线视频| 久久不射中文字幕| 欧美日韩亚洲成人| 欧美大色视频| 韩国三级电影久久久久久| av成人天堂| 亚洲免费精品| 理论片一区二区在线| 欧美在线亚洲| 国产精品成人av性教育| 亚洲国产福利在线| 伊人激情综合| 久久国产日本精品| 久久黄金**| 国产日本欧美一区二区三区在线| av不卡在线看| 日韩午夜在线观看视频| 麻豆成人在线| 欧美高清一区二区| 亚洲第一在线综合在线| 久久精品成人| 老司机67194精品线观看| 国产欧美日韩精品在线| 中文久久精品| 亚洲自拍偷拍视频| 国产精品乱码| 西瓜成人精品人成网站| 欧美在线黄色| 国产偷国产偷精品高清尤物| 午夜伦欧美伦电影理论片| 午夜精品久久久99热福利| 国产精品激情| 亚洲欧美精品在线观看| 欧美一级大片在线免费观看| 国产日产欧美精品| 欧美诱惑福利视频| 美女被久久久| 亚洲精品视频免费观看| 欧美一区二区三区成人| 国产精品天天摸av网| 亚洲欧美大片| 久久躁狠狠躁夜夜爽| 影音先锋日韩精品| 欧美国产极速在线| 在线亚洲精品| 久久人人爽爽爽人久久久| 在线看日韩欧美| 欧美福利电影在线观看| 日韩视频一区二区在线观看| 午夜精品视频网站| 国产专区欧美精品| 免费在线成人| 国产精品99久久久久久www| 久久成人人人人精品欧| 亚洲国产精品成人va在线观看| 欧美精品系列| 午夜久久久久久| 亚洲第一福利在线观看| 亚洲欧美日韩另类| 在线视频成人| 欧美性猛交99久久久久99按摩| 欧美在线观看视频| 最新国产成人在线观看| 午夜在线电影亚洲一区| 91久久在线| 国产视频一区三区| 欧美激情网友自拍| 欧美亚洲一区二区在线| 亚洲人精品午夜| 久久一区二区三区四区五区| 夜夜狂射影院欧美极品| 尤物精品在线| 国产精品视频久久| 欧美大片免费观看在线观看网站推荐| 亚洲一区二区免费| 亚洲国产天堂网精品网站| 久久精品成人| 亚洲综合不卡| 日韩亚洲一区二区| 狠狠爱成人网| 国产伦理一区| 欧美性大战xxxxx久久久| 免费成人性网站| 欧美中文字幕在线视频| 国产精品99久久久久久宅男| 亚洲高清久久| 蜜月aⅴ免费一区二区三区| 欧美一区二区日韩一区二区| 9国产精品视频| 亚洲精品久久久久久久久久久| 国模私拍视频一区| 国产精品网站一区| 欧美日韩亚洲一区二| 欧美电影资源| 欧美大片在线看免费观看| 久久婷婷蜜乳一本欲蜜臀| 欧美在线日韩精品| 久久成人精品一区二区三区| 亚洲综合色在线| 亚洲午夜久久久| 亚洲一区二区三| 亚洲小说春色综合另类电影| 亚洲最新中文字幕| 一区二区三区高清视频在线观看| 亚洲国产一区二区三区在线播| 欧美成人一二三| 欧美激情五月| 亚洲第一区在线观看| 欧美福利视频一区| 亚洲二区精品| 日韩午夜中文字幕| 一区二区欧美激情| 亚洲一区二区三区中文字幕| 亚洲欧美激情一区| 久久国产精品99国产| 久久久噜噜噜久噜久久| 毛片精品免费在线观看| 免费不卡在线视频| 欧美激情在线免费观看| 欧美日韩精品一区二区| 国产精品激情偷乱一区二区∴| 国产精品推荐精品| 国产综合色产| 亚洲精品美女在线| 亚洲一区二区三区欧美| 性欧美videos另类喷潮| 久久婷婷蜜乳一本欲蜜臀| 欧美成人小视频| 99国产精品私拍| 亚洲欧美在线高清| 久久欧美肥婆一二区| 欧美精品18+| 国产精品视频专区| 在线观看久久av| 亚洲天堂成人| 久久午夜精品一区二区| 最新中文字幕一区二区三区| 亚洲一区免费视频| 美女国产一区| 国产精品一区亚洲| 亚洲国产成人tv| 香蕉成人伊视频在线观看| 欧美高清不卡在线| 亚洲一区一卡| 欧美韩日高清| 极品av少妇一区二区| 一本久道久久综合婷婷鲸鱼| 久久精品99久久香蕉国产色戒| 亚洲国内精品在线| 午夜视频久久久久久| 欧美日韩免费一区| 在线精品福利| 欧美一级网站| 日韩亚洲视频| 蜜月aⅴ免费一区二区三区| 国产精品亚洲а∨天堂免在线| 亚洲欧洲日产国码二区| 久久精品国产2020观看福利| 日韩一二在线观看| 猛干欧美女孩| 在线精品视频一区二区| 久久国产精品99国产精| 亚洲深夜福利网站|