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

清風竹林

ぷ雪飄絳梅映殘紅
   ぷ花舞霜飛映蒼松
     ----- 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>
            91久久精品美女| 欧美3dxxxxhd| 久久精品免费播放| 欧美一级欧美一级在线播放| 亚洲毛片网站| 亚洲日本va午夜在线影院| 一区二区在线看| 黄色一区二区在线| 亚洲人精品午夜| 一区二区三区三区在线| 亚洲香蕉网站| 久久精品99| 欧美黑人多人双交| 9l国产精品久久久久麻豆| 亚洲一区二区不卡免费| 亚洲男女毛片无遮挡| 久久精品国产亚洲高清剧情介绍| 久久久久在线| 欧美午夜在线一二页| 国产视频一区三区| 在线观看一区视频| 99在线观看免费视频精品观看| 亚洲资源av| 欧美成人四级电影| 一区二区三区蜜桃网| 久久精品国产在热久久| 欧美日韩国产成人在线91| 国产精品夜色7777狼人| 亚洲精品国产精品国自产观看浪潮 | 亚洲视频网在线直播| 久久精彩免费视频| 欧美激情精品久久久久久黑人| 国产精品蜜臀在线观看| 亚洲黄色毛片| 欧美在线观看视频一区二区| 亚洲激情一区二区| 欧美专区在线| 国产精品盗摄久久久| 亚洲国产精品123| 久久aⅴ乱码一区二区三区| 亚洲人成艺术| 久久一区视频| 国产在线视频欧美一区二区三区| aa级大片欧美三级| 欧美a级一区二区| 久久精品91久久久久久再现| 国产精品久久久久久久久久久久久久 | 亚洲深夜福利视频| 欧美精品久久天天躁| 在线播放豆国产99亚洲| 久久成人精品视频| 亚洲小说春色综合另类电影| 欧美精品性视频| 欧美肥婆在线| 亚洲激情网址| 精品电影在线观看| 国产视频在线观看一区二区| 亚洲少妇自拍| 亚洲理论在线| 欧美日韩一区二区免费视频| 亚洲区欧美区| 亚洲国产综合视频在线观看| 久久婷婷影院| 亚洲第一精品福利| 欧美高清视频www夜色资源网| 久久久精品欧美丰满| 国内精品写真在线观看| 久久久久久久欧美精品| 久久se精品一区二区| 韩国精品主播一区二区在线观看| 久久精品亚洲精品| 香港久久久电影| 激情av一区二区| 久久久人成影片一区二区三区观看 | 快播亚洲色图| 久久久亚洲人| 亚洲国产高清在线观看视频| 欧美黑人在线播放| 欧美精品在线播放| 欧美在线国产| 久久国产精品毛片| 又紧又大又爽精品一区二区| 亚洲第一区在线| 欧美日韩中字| 久久夜色精品国产欧美乱极品 | 亚洲伦理在线| 国产伦理精品不卡| 免费日韩精品中文字幕视频在线| 欧美高清日韩| 西西人体一区二区| 久久久久一区二区| 亚洲精品黄色| 亚洲在线视频一区| 亚洲日本电影| 亚洲欧美日韩国产精品| 亚洲国产婷婷香蕉久久久久久99 | 这里只有精品视频| 亚洲欧美国产高清| 亚洲国产精品久久精品怡红院| 99re这里只有精品6| 国产一区二区精品久久91| 亚洲高清视频一区二区| 国产精品老牛| 亚洲韩国日本中文字幕| 国产亚洲va综合人人澡精品| 91久久精品国产91久久性色| 国产欧美精品一区| 亚洲第一网站| 亚洲一区二区三区中文字幕在线| 午夜免费日韩视频| 亚洲日本国产| 欧美一区日本一区韩国一区| 日韩午夜激情av| 久久久久久成人| 午夜在线播放视频欧美| 欧美精品一区二区高清在线观看| 久久免费视频这里只有精品| 欧美涩涩网站| 最新国产拍偷乱拍精品| 伊人成人网在线看| 午夜精品成人在线| 亚洲午夜激情网站| 欧美精品一区二区三区在线播放 | 亚洲国产精品久久久| 国内精品久久久久久久影视麻豆| 99热在这里有精品免费| 亚洲激情在线激情| 亚洲大胆在线| 亚洲高清久久久| 久久久国产亚洲精品| 久久精品视频va| 国产人成精品一区二区三| 日韩亚洲一区在线播放| 在线亚洲成人| 欧美日精品一区视频| 日韩网站在线看片你懂的| 9色porny自拍视频一区二区| 欧美美女喷水视频| 亚洲精品孕妇| 亚洲一区二区三区久久| 国产精品www网站| 亚洲亚洲精品三区日韩精品在线视频| 亚洲视频在线观看免费| 国产精品国产三级国产普通话蜜臀 | 亚洲国产毛片完整版| 亚洲国产欧美日韩| 欧美精品123区| 一本一本大道香蕉久在线精品| 亚洲免费在线精品一区| 国产视频久久久久久久| 久久久久久久97| 亚洲丁香婷深爱综合| 国产精品99久久久久久久vr| 欧美亚州韩日在线看免费版国语版| 亚洲一区国产一区| 免费欧美日韩| 中文精品一区二区三区| 国产精品一区二区欧美| 久久网站热最新地址| 亚洲裸体视频| 久久国产精品99久久久久久老狼| 尤物精品国产第一福利三区 | 亚洲一区二区免费视频| 亚洲在线日韩| 国产视频精品va久久久久久| 久久久久天天天天| 亚洲国产成人久久综合一区| 亚洲精品久久7777| 国产精品网曝门| 午夜宅男欧美| 亚洲国产精品综合| 久久久久久久性| 亚洲激情一区二区| 欧美专区日韩视频| 亚洲福利视频一区| 国产精品白丝黑袜喷水久久久| 一区二区免费在线播放| 91久久精品美女| 免费观看欧美在线视频的网站| 亚洲黄色在线视频| 香蕉成人伊视频在线观看| 亚洲激情网址| 国产精品乱看| 欧美黄色免费| 亚洲综合二区| 亚洲乱码精品一二三四区日韩在线| 亚洲欧美日韩精品久久亚洲区| 亚洲电影在线| 国产精品成人国产乱一区| 免费视频一区| 亚洲欧美日本伦理| 99热这里只有精品8| 狼狼综合久久久久综合网 | 中文一区二区在线观看| 欧美高清视频在线 | 欧美一级免费视频| 一区二区三区免费网站| 免费一级欧美片在线播放| 欧美亚洲综合另类| 99国产精品99久久久久久|